目录
目标
对mysql的学习总结,我会从执行引擎、索引、sql、锁、MVCC、事务等几个部分进行阐述。本节阐述索引,包括索引采用的数据结构、如何更好的创建索引、索引使用的注意事项等。
数据结构
mysql各种索引都采用B+Tree数据结构
为什么选择B+树,而不是B树?
考虑磁盘IO消耗低,查找效率更稳定等等。
B树(B-树)
每个节点都存储具体数据,从而块中可存记录变少,导致磁盘IO增多,树高度增加。
命中可能发生在任意节点,查找的效率不稳定
B+树
只有叶子节点存储具体数据,其它节点只存储key和指针,从而块中记录增多,树高度降低,同样大小的内存可缓存更多的节点,磁盘IO也减少。
命中只发生在叶子节点,查找效果稳定。
磁盘IO什么时候发生?
需要读取的数据未缓存到内存中。
结构图示
聚族索引结构+二级索引(非聚簇索引)结构图示
如图可见:
表存在主键时:聚簇索引=主键索引
二级索引的叶子结点数据包括 索引内容与主键ID。
二级索引命中主键ID后,使用主键ID查询主键索引命中记录。
其他
树的高度=索引的高度
索引的高度影响查询效率,建议索引高度控制在3层以内,表数据量控制在1千5百万左右。
索引类型
InnerDB的聚簇索引
仅限InnerDB引擎
聚集原则
1:存在主键,则主键构建聚簇索引
2:不存在主键,则第一个不允许NULL的唯一索引构建为聚簇索引
3:均不满足,则使用rowid构建聚簇索引。
特点
索引节点+数据节点,构成了数据叶子节点。