目的数据库
数据库中很重要的设计一部分,莫过于索引了。B+树索引是MySQL中设计的索引。B+树索引是基于B+树基础发展而来的。并发
然而,在理解了B+树索引结构之后,对优化SQL会事半功倍。还针对前面MySQL索引选择规则文章作进一步分析。优化
1:B+树与B+树索引区别spa
B+树 | B+树索引 | |
存储位置 | 内存 | 磁盘 |
扇出率 | 低 | 高 |
并发控制 | 能够不考虑 | 须要考虑 |
分裂方向 | 不须要考虑 | 向左、向右 |
上图中列出二者的区别,光看图片可能不能理解每一个区别对应的含义。.net
下面就来分析一下重要的区别:设计
1.1:存储位置:指针
B+树是为磁盘或其余直接存取辅助设备而设计的一种平衡查找树,所以主要操做是计算不须要文件来存储,也就是在内存来操做的。orm
B+树索引是基于磁盘,所以数据库会出现索引文件,索引文件就是存储在磁盘上的。blog
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:MySQL索引选择规则(主键查询)
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的索引。