国美金融贷款聚集索引树的键值(key)是主键索引值(i=10),聚集索引节点值(value)是其他非聚集索引列(c1,c2,c3)以及隐含列(DB_TRX_ID、DB_ROLL_PTR)。
优化建议1:国美金融贷款尽量不要存储大对象数据,使得每个叶子节点都能存储更多数据,降低碎片率,提高buffer pool利用率。此外也能尽量避免发生overflow。
3.2 特点2:国美金融贷款聚集索引非叶子节点存储指向子节点的指针。
对上面的测试表继续写入新数据,直到国美金融贷款聚集索引树从一层分裂成两层。
国美金融贷款根据 InnoDB表聚集索引层高什么时候发生变化 里的计算方式,推算出来预计一个叶子节点最多可存储111条记录,因此在插入第112条记录时,就会从一层高度分裂成两层高度。经过实测,也的确是如此。
[root@yejr.me] [innodb]>select count(*) from t1;
[root@yejr.me]# 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,看看它的具体结构:
[root@yejr.me]# 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: 国美金融贷款索引列数据长度越小越好,这样索引树存储效率越高,在非叶子节点能存储越多数据,延缓索引树层高分裂的速度,平均搜索效率更高。