执行计划有什么用

我们的系统上线后数据库的记录不断增加,之前写的一些SQL语句或者一些ORM操作效率变得非常低。我们不得不考虑SQL优化,SQL优化大概是这样一个流程:1.定位执行效率低的SQL语句(定位),2.分析为什么这段SQL执行的效率比较低(分析),3.最后根据第二步分析的结构采取优化措施(解决)。而EXPLAIN命令的作用就是帮助我们分析SQL的执行情况,属于第二步。

EXPLAIN命令是查看查询优化器如何决定执行查询的主要的方法。学会解释EXPLAIN将帮助我们了解SQL优化器是如何工作的。执行计划可以告诉我们SQL如何使用索引,连接查询的执行顺序,查询的数据行数。

mysql优化器

优化器是数据库的一个核心子系统,你也可以把他理解为MySQL数据库中的一个核心模块或者一个核心功能模块。
目的是按照一定原则来得到她认为的目标SQL在当前情形下最有效的执行路径,优化器的目的是为了得到目标SQL的执行计划.

查看 mysql 执行计划

explain + sql

字段说明
id如果不带子查询,id不增加.如果有子查询的,自查询数字增加,先执行子查询,即数据大的先执行.(从大到小).
select_type查询类型
table前查询被扫描到的表 可能是表的别名
partitions
type表扫描方式
possible_keys可能被使用到的索引
key被使用的索引
key_len使用过的索引的长度
ref
rowsmysql 预估为了找到所需的行而要读取的行数
filtered(返回比例)
Extra额外的说明

select_type

valueexplain
SIMPLE简单查询
PRIMARY最外层查询
SUBQUERY映射为子查询
DERIVED子查询
UNION联合
UNION RESULT使用联合的结果

type

valueexplain
ALL全数据表扫描
index全索引表扫描
RANGE对索引列进行范围查找
INDEX_MERGE合并索引,使用多个单列索引搜索
REF根据索引查找一个或多个值
EQ_REF搜索时使用primary key 或 unique类型
CONST常量,表最多有一个匹配行,因为仅有一行,在这行的列值可被优化器剩余部分认为是常数,const表很快,因为它们只读取一次。
SYSTEM系统,表仅有一行(=系统表)。这是const联接类型的一个特例。

性能:all < index < range < index_merge < ref_or_null < ref < eq_ref < system/const
性能在 range 之下基本都可以进行调优