概述
我们还是以InnoDB索引组织形式写这篇文章。我们知道InnoDB的索引是B+树存储。
B+树对比B树
和B树相比,B+树中间节点不存储数据,只有叶子节点存储数据,所以中间页存储的数据更多,另外叶子节点间有链接,进行范围遍历时,可以使用链表的形式遍历,更快速。
B+树和平衡二叉树相比
B+树是多叉树。这样的话一页存的数据更多,树高更矮。我们想象下100万的数据,如果是二叉树存储,就需要20层的树高,在机械硬盘时代,一次随机磁盘访问,都需要10ms左右的时间,20层,这个耗时是不能忍受的。
主键索引
也叫聚簇索引,叶子节点是数据页,数据页中存储行数据
非主键索引
也叫二级索引,叶子节点是索引页,索引页中存储索引和主键数据。
当我们通过二级索引查找,查找的字段全部在索引页中时,这个时候叫覆盖索引。当我们查找的字段有些不在索引页中时,需要通过在索引页得到的主键ID回主键索引中再次查询行数据, 这个时候叫回表。
下图是主键索引和普通索引k,两个索引树的示意图。

了解上面这些以后我们想一下,mysql的多叉树,到底是多少叉?
其实是根据页大小和索引字段长度决定,InnoDB页默认是16k,当使用Int字段索引时,索引页就是几千叉。一百万数据数据树高两层就能够了。
参考资料
- 高性能Mysql
- MySQL实战45讲