MySQL查看 InnoDB表中每个索引的高度

  我们都知道MySQL里,索引通常用B+树来实现的。B+树的叶子结点才具体保存数据(聚簇索引保存的是行数据;普通索引是主键,如有需要得回表),非叶子结点都是用来索引叶子结点的。假设索引高度为h,那么每次索引查询都要查询h个索引页面才能找到叶子结点的索引数据。所以h的大小,势必成为索引效率的一个关键。那么通常表的索引高度h是多大呢?

  我们再假设扇出系数为k,则索引里可索引key的数s=k^h。  

  在InnoDB里,每个页默认16KB,假设索引的是8B的long型数据,每个key后有个页号4B,还有6B的其他数据(参考《MySQL技术内幕:InnoDB存储引擎》P193的页面数据),那么每个页的扇出系数为16KB/(8B+4B+6B)≈1000,即每个页可以索引1000个key。在高度h=3时,可索引的叶子页面数=1000^2=100W(因为最下一层为叶子页面)。假设每行记录大小为1KB,则每个叶子页面可以容纳16行,则总共可索引的行数为100W*16=1600W!!也就是说,InnoDB通过三次索引页的I/O,即可索引1600W的key。同理,在高度h=4时,总行数=1000^3*16=160亿条!!!

 

通常来说,索引树的高度在2~4。当然,这也跟要索引字段的数据类型有关,如果是int或short,索引效率更好,而如果是varchar(100),那扇出系数就低了,索引效率自然要低些。所以我们在索引字段时,字段的类型越简单效率越好。

  具体如何查看索引树的高度,可参考:查看 InnoDB表中每个的索引高度

posted @ 2017-03-29 10:47  waterystone  阅读(3927)  评论(0编辑  收藏  举报