前言
工作中经常会遇到各种复合查询语句的编写,一条优秀的sql语句可以较好的提升查询速度,但很多开发者对sql优化还没有很清晰的认识,或者说不知道该怎么优化。本篇博客就是用来解决这个问题。
如何查看sql执行计划
1.命令行窗口查看
在mysql命令窗口,输入 explain + 要查看的SQL语句,回车就可以看到了。
2.navicat 查询窗口查看
选中语句,点击解释(此处使用的navicat版本为 navicat for mysql 10.0.11 不同版本解释按钮位置可能略有不同)
3.sql执行计划解读
id:
SQL执行顺序,相同ID执行顺序自上而下。ID不同,如果是子查询,ID序号会递增,ID值越大优先级越高,越优先执行。
select_type
1、SIMPLE:简单的select查询,查询中不包含子查询或者union
2、PRIMARY:查询中包含任何复杂的子部分,最外层查询则被标记为primary
3、SUBQUERY:在select 或 where列表中包含了子查询
4、DERIVED:在from列表中包含的子查询被标记为derived(衍生),mysql或递归执行这些子查询,把结果放在零时表里
5、UNION:若第二个select出现在union之后,则被标记为union;若union包含在from子句的子查询中,外层select将被标记为derived
6、UNION RESULT:从union表获取结果的select
type
访问类型,sql查询优化中一个很重要的指标,结果值从好到坏依次是:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
一般来说,好的sql查询至少达到range级别,最好能达到ref。ALL是全表扫,最好消灭
possible_keys
查询涉及到的字段上存在索引,则该索引将被列出,但不一定被查询实际使用
key
实际使用的索引,如果为NULL,则没有使用索引。
查询中如果使用了覆盖索引,则该索引仅出现在key列表中
key_len
表示索引中使用的字节数,查询中使用的索引的长度(最大可能长度),并非实际使用长度,理论上长度越短越好。key_len是根据表定义计算而得的,不是通过表内检索出的
ref
显示索引的那一列被使用了,如果可能,是一个常量const。
rows
根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数