第五章 MySQL 基础优化-索引及执行计划
1. 什么是索引?
相当于一本书中的目录。优化查询。
2. MySQL 支持的索引类型(算法)
Btree : 平衡多叉树
Rtree :空间树所以
Hash :HASH索引
Fulltext :全文索引
3. 数据查找算法介绍
二叉树
红黑树
Btree : Balance Ttree
4. Btree的查找算法(见图)
B-tree
B+tree
B*tree
5. MySQL Btree索引的应用
5.1 聚簇索引(聚集索引、主键索引)
前提:
0. InnoDB存储引擎的表才会有聚簇索引。
1. 有主键,主键就是聚簇索引
2. 没有主键,选择唯一键作为聚簇索引
3. 生成一个隐藏列(DB_ROW_ID,6字节),作为聚簇索引
作用:
1. 聚簇(区)索引,组织表(IOT): 所有数据在插入时,都按照ID(主键)属性,在相邻数据页上有序存储数据。
2. 加快存储数据,加快通过索引作为查找条件的查询。
参考:
https://dev.mysql.com/doc/refman/5.7/en/innodb-index-types.html
聚簇索引构建过程(见图)
1. 叶子节点 :
由于存储数据时,已经按照ID顺序在各个数据页中有序存储了,所以《原表数据》所在数据页被作为叶子节点。
2. 内部节点(非叶子节点):
获取叶子节点ID范围+指针。
3. 根节点:
获取非叶子节点 ID范围+指针
5.2 辅助索引(见图)
构建过程:
1. 叶子节点构建:
提取索引列值+ID ,进行从小到大排序(辅助索引列值),存储到各个数据页,作为Leaf node。
2. 非叶子节点(internel node )
提取下层的辅助索引列值范围+指针。
3. 根节点:
提取下层节点的范围+指针。
对于查询的优化:
1. 通过辅助索引列,进行条件查询,根据辅助索引BTREE快速锁定条件值对应的ID。
2. 通过得出的ID值,回到聚簇索引继续查询到具体的数据行(回表)。
6. 辅助索引分类
6.1. 普通单列
6.2. 联合索引
idx(a,b)
叶子节点:
id+a+b ,按照a和b进行排序,生成叶子节点
枝节点和根节点:
只会包含最左列(a列)的范围+指针
注意: 最左原则
1. 建索引,最左列重复值少的。
2. 查询条件中,必须包含最左列。
6.3. 唯一索引
unique key
6.4. 前缀索引
idex(test(10))
7. 索引树高度影响因素
3.1 列值长度
前缀索引。
3.2 数据量
分区表 。
定期归档表。
分布式架构:分库、分表。
3.3 数据类型
char(20)
varchar(20)
8. 回表问题的探讨?
什么是回表?
辅助索引查找完成----》 聚簇索引查询过程。
回表会带来的问题?
IO增多: 量、次数
如何减少回表 ?
使用唯一值索引查询
联合索引
覆盖索引:辅助索引完全覆盖到查询结果