【mysql体系结构】B+树索引
B+树索引总结
- 每个索引都对应一颗B+树,B+树分为好多层,最下边一层是叶子节点,其余都是内节点。所有用户记录都存储在B+树的叶子节点,所有目录项记录都存储在内节点
- InnoDB存储引擎会自动为主键(如果没有它会自动帮我们添加)建立聚簇索引,聚簇索引的叶子节点包含完整的用户记录
- 我们可以为自己感兴趣的列建立二级索引,二级索引的叶子节点包含的用户记录由索引列+主键组成,所以如果想要通过二级索引来查找完整的用户记录的话,需要通过回表操作,也就是通过二级索引找到主键值之后再到聚簇索引中查找完整的用户记录
- B+树中每层节点都是按照索引列值从小到大的顺序排序而组成了双向链表,而且每个页内的记录(不论是用户记录还是目录项记录)都是按照索引列的值从大到小的顺序而形成一个单链表。如果是联合索引的话,则页面和记录先按照联合索引前边的列排序,如果该列值相同,再按照联合索引后边的列排序。
- 通过索引查找记录是从B+树的根节点开始,一层一层向下搜索。由于每个页面都按照索引列的值建立了Page Directory(页目录),所以在这些页面中的查询非常快。
在使用索引时需要注意的事项
- 只为用于搜索、排序或分组的列创建索引
- 为列的基数大的列创建索引
- 索引列的类型尽量小
- 可以只对字符串值的前缀创建索引
- 只有索引列在比较表达式中单独出现才可以适用索引
- 为了尽可能少的让聚簇索引发生页分裂和记录移位的情况,建议让主键拥有AUTO_INCREMENT属性
- 定位并删除表中的重复和冗余索引
- 尽量使用覆盖索引进行查询,避免回表带来的性能损耗。