MySQL Server有一个称为查询优化器的模块,一条查询语句进行语法解析之后就会被交给查询优化器来进行优化,优化的结果就是生成一个所谓的执行计划,这个执行计划表明了应该使用哪些索引进行查询,表之间的连接顺序是啥样的,最后会按照执行计划中的步骤调用存储引擎提供的方法来真正的执行查询,并将查询结果返回给用户
访问方法
单表查询,MySQL查询的执行方式分为两种:使用全表扫描查询,使用索引进行查询
- 使用全表查询:把全表数据扫描,把符合条件的数据加入结果集返回
- 使用索引进行查询:使用索引进行查询
- 针对主键或者唯一二级索引进行等值查询
- 针对普通二级索引进行等值查询
- 针对索引列的范围查询
- 直接扫描整个索引
const
通过主键或者唯一二级索引列来定位一条记录的访问方法定义为:const
唯一二级索引列并不限制 NULL 值的数量,所以上述语句可能访问到多条记录,也就是说 上边这个语句不可以使用const访问方法来执行
ref
搜索条件为二级索引列与常数等值比较,采用二级索引来执行查询的访问方法称为:ref
- 二级索引列为NULL:包含NULL值的数量并不限制,所以我们采用key IS NULL这种形式的搜索条件最多只能使用 ref
- 对于某个包含多个索引列的二级索引来说,只要是最左边的连续索引列是与常数的等值比较就可能采用 ref 的访问方法
ref_or_null
针对二级索引列的值等于某个常数的记录,和该列的值为NULL的使用二级索引的查询:ref_or_null
range
利用索引进行范围匹配的访问方法称之为:range
index
采用遍历二级索引记录的执行方式称之为:index
all
使用全表扫描执行查询的方式称之为:all
索引合并
使用到多个索引来完成一次查询的执行方法称之为:index merge
Intersection合并
某个查询可以使用多个二级索引,将从多个二级索引中查询到的结果取交集
- 二级索引列是等值匹配的情况,对于联合索引来说,在联合索引中的每个列都必须等值匹配,不能出现只匹配部分列的情况
- 主键列可以是范围匹配
Union合并
使用不同索引的搜索条件之间使用 OR 连接起来的情况
- 二级索引列是等值匹配的情况,对于联合索引来说,在联合索引中的每个列都必须等值匹配,不能出现只出现匹配部分列的情况
- 主键列可以是范围匹配
- 使用 Intersection 索引合并的搜索条件
Sort-Union合并
先按照二级索引记录的主键值进行排序,之后按照Union索引合并方式执行的方式称之为 Sort-Union 索引合并
