國美金融貸款聚集索引樹的鍵值(key)是主鍵索引值(i=10),聚集索引節點值(value)是其他非聚集索引列(c1,c2,c3)以及隱含列(DB_TRX_ID、DB_ROLL_PTR)。
優化建議1:國美金融貸款儘量不要存儲大對象數據,使得每個葉子節點都能存儲更多數據,降低碎片率,提高buffer pool利用率。此外也能儘量避免發生overflow。
3.2 特點2:國美金融貸款聚集索引非葉子節點存儲指向子節點的指針。
對上面的測試表繼續寫入新數據,直到國美金融貸款聚集索引樹從一層分裂成兩層。
國美金融貸款根據 InnoDB表聚集索引層高什麼時候發生變化 裏的計算方式,推算出來預計一個葉子節點最多可存儲111條記錄,因此在插入第112條記錄時,就會從一層高度分裂成兩層高度。經過實測,也的確是如此。
[[email protected]] [innodb]>select count(*) from t1;
[[email protected]]# innblock innodb/t1.ibd scan 16
===INDEX_ID:238
level1 total block is (1)
block_no: 3,level: 1|*|
level0 total block is (2)
block_no: 5,level: 0|*|block_no: 6,level: 0|*|
此時可以看到國美金融貸款根節點依舊是pageno=3,而葉子節點變成了[5, 6]兩個page。由此可知,國美金融貸款根節點上應該只有兩條物理記錄,存儲着分別指向pageno=[5, 6]這兩個page的指針。
我們解析下3號page,看看它的具體結構:
[[email protected]]# innodb_space -s ibdata1 -T innodb/t1 -p 3 page-dump
records:
{:format=>:compact,
:offset=>125,
:header=>
{:next=>138,
:type=>:node_pointer,
:heap_number=>2,
:n_owned=>0,
:min_rec=>true, #第一條記錄是min_key
:deleted=>false,
:nulls=>[],
:lengths=>{},
:externs=>[],
:length=>5},
:next=>138,
:type=>:clustered,
#第一條記錄,只存儲key值
:key=>[{:name=>"id", :type=>"INT UNSIGNED", :value=>1}],
:row=>[],
:sys=>[],
:child_page_number=>5, #value值是指向的葉子節點pageno=5
:length=>8} #整條記錄消耗8字節,除去key值4字節外,指針也需要4字節
{:format=>:compact,
:offset=>138,
:header=>
{:next=>112,
:type=>:node_pointer,
:heap_number=>3,
:n_owned=>0,
:min_rec=>false,
:deleted=>false,
:nulls=>[],
:lengths=>{},
:externs=>[],
:length=>5},
:next=>112,
:type=>:clustered,
#第二條記錄,只存儲key值
:key=>[{:name=>"id", :type=>"INT UNSIGNED", :value=>56}],
:row=>[],
:sys=>[],
:child_page_number=>6, #value值是指向的葉子節點pageno=6
:length=>8}
優化建議2: 國美金融貸款索引列數據長度越小越好,這樣索引樹存儲效率越高,在非葉子節點能存儲越多數據,延緩索引樹層高分裂的速度,平均搜索效率更高。