目的
数据库中很重要的设计一部分,莫过于索引了。B+树索引是MySQL中设计的索引。B+树索引是基于B+树基础发展而来的。
然而,在理解了B+树索引结构以后,对优化SQL会事半功倍。还针对前面文章做进一步分析。
1:B+树与B+树索引区别
B+树 | B+树索引 | |
存储位置 | 内存 | 磁盘 |
扇出率 | 低 | 高 |
并发控制 | 可以不考虑 | 需要考虑 |
分裂方向 | 不需要考虑 | 向左、向右 |
上图中列出两者的区别,光看图片可能不能理解每个区别对应的含义。
下面就来分析一下重要的区别:
1.1:存储位置:
B+树是为磁盘或其他直接存取辅助设备而设计的一种平衡查找树,因此主要操作是计算不需要文件来存储,也就是在内存来操作的。
B+树索引是基于磁盘,因此数据库会出现索引文件,索引文件就是存储在磁盘上的。
1.2:分裂方向
B+树是内存结构,不需要考虑页分裂的方向。
B+树索引在磁盘上,为了充分利用磁盘的顺序特性,还需要根据不同插入情况考虑不同的分裂点记录以及分裂的方向。
2:MySQL的InnoDB存储引擎的索引设计
InnoDB存储引擎将B+树索引分为聚集索引和辅助索引。
聚集索引是通过将表的主键作为键值来构造B+树。如果没有显示创建,自动创建一个6字节的主键。聚集索引还包含记录所有列信息。
2.1:存储结构
聚集索引的非叶子点存放的是<键值, 地址>,地址为指向下一层的指针。叶子点存放的是<记录信息>。
辅助索引的非叶子点存放的是<键值,主键值, 地址>,叶子点存放的是<主键>。
2.2:查询方式
MySQL通过辅助索引查询数据时,只是查询出主键值,再通过主键查询聚集索引,最后确定记录信息。
2.3:记录数量
通常辅助索引比聚集索引的高度要小。如记录的长度为100字节,辅助索引记录的长度为40字节,对比后的结果为:
B+树的高度 | 聚集索引 | 辅助索引 |
1 | 160(16K/100) | 500(16K/40) |
2 | 25600 | 250000 |
3 | 4096000 | 125000000 |
4 | 655360000 | 62500000000 |
同样的高度下辅助索引能存放更多的记录。
1:(主键查询)
students_origin表中只有主键,因此执行计划使用主键查询id信息。
studentns表中有多个索引。
查询结果只有主键一个字段,再根据2.1来分析,主键其实存放在辅助索引里面的。
根据2.3来分析,假如辅助索引"idx_rank"只有一个页(MySQL最小单位)存储了所有记录数,辅助索引"idx_major"有两个页存储了所有记录数,辅助索引"idx_rank_total"有三个页存储了所有记录数,聚集索引需要四个页存储了所有记录数,如果每次IO只能读取一个页信息。"idx_rank"一次IO,"idx_major"两次IO,"idx_rank_total"三次IO,聚集索引要四次IO。
结论,选择最少那次IO的索引。