MySQL 索引选择原则分析(一)
2015-10-13 00:00
591 查看
摘要: B+树索引原理及设计分析
目的
数据库中很重要的设计一部分,莫过于索引了。B+树索引是MySQL中设计的索引。B+树索引是基于B+树基础发展而来的。
然而,在理解了B+树索引结构以后,对优化SQL会事半功倍。还针对前面MySQL索引选择规则文章做进一步分析。
1: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字节,对比后的结果为:
同样的高度下辅助索引能存放更多的记录。
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的索引。
目的
数据库中很重要的设计一部分,莫过于索引了。B+树索引是MySQL中设计的索引。B+树索引是基于B+树基础发展而来的。
然而,在理解了B+树索引结构以后,对优化SQL会事半功倍。还针对前面MySQL索引选择规则文章做进一步分析。
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: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的索引。
相关文章推荐
- Mysql二进制日志binlog
- mysql中的锁
- Mysql中的索引
- MySQL利用正则匹配函数实现多个条件查询
- 学一点 mysql 双机异地热备份—-mysql主从,主主备份原理及实践
- MySQL索引题目分析
- mysql的autocommit
- mysql命令
- MySQL删除重复数据行,只保留一条
- Ubuntu 安装mysql和简单操作
- MySQL 数据库的命令行操作
- [实战]MVC5+EF6+MySql企业网盘实战(5)——登录界面,头像等比例压缩
- SQLServer MySql 计数器表
- db_mysqli
- MYSQL数据库 初学笔记1
- [mysql] mysql如何实现更新一条记录中某个字段值的一部分呢?
- MySQL中数据操作DML
- MySQL first meet
- mysql游标循环多一次的解决办法
- mysql相关包括事件、事务、以及服务器上自动备份