MySQL explain 执行计划学习一下吧,MySQL优化学习第3天
【摘要】 explain(执行计划) 命令使用 explain 命令可以查看 SQL 执行的具体细节。例如:explain SELECT * FROM `表名称`得到如下结果其中各个参数的含义分别是id:查询的序列号,包含一组数字,有如下三种情况:id相同:执行顺序(表顺序)由上至下id不同,但查询时子查询,此时id的序号会递增,id值越大优先级越高,越先被执行;id相同和id不同同时存在,id 大...
explain(执行计划) 命令
使用 explain 命令可以查看 SQL 执行的具体细节。
例如:
explain SELECT * FROM `表名称`
得到如下结果

其中各个参数的含义分别是
id:查询的序列号,包含一组数字,有如下三种情况:- id相同:执行顺序(表顺序)由上至下
- id不同,但查询时子查询,此时id的序号会递增,id值越大优先级越高,越先被执行;
- id相同和id不同同时存在,id 大的先执行,id 相同的从上到下执行。
select_type:查询类型,一般有SIMPLE,PRIMARY,UNION,SUBQUERY;table:表或者衍生表名称;partitions:显示表的分区名;type:表的连接类型,按照性能排序分别为system>const>eq_ref>re>ref_or_null>index_merge>unique_subquery>unique_subquery>range>index>all;possible_keys:查询时,能够使用的索引;key:真正使用的索引;key_len:索引长度;ref:索引的哪一列被使用;rows:扫描的行数,越少越好;filtered:存储引擎返回的数据在服务层过滤后,剩下满足过滤条件的百分比,值越大越好;Extra:执行情况的说明。
其中 type 字段很重要,表示的查询性能,其值也比较多,上文只是概述,下面详细说明。
system:表仅有一行,系统表,一般出现不了;const:通过索引一次查找到数据;eq_ref:每条记录只有一行;ref:类似上述内容,但使用的是普通索引;fulltext:全文索引;ref_or_null:同上,包含对 NULL 查询;index_merge:索引合并优化;unique_subquery:in语句包含一个查询主键字段的查询;index_subquery:in语句后面是非唯一索引字段的查询;range:范围查询,一般在 where 语句使用了between,<,>,in;index:数据是通过查询索引得到的数据;all:全表扫描。
要保证
sql查询,一般要达到range或ref级别。
上述列名 Extra 可能会包含如下值。
using index:查询使用了索引,出现表示好;using where:查询结果使用了过滤;using temporary:使用了临时表;using filesort:使用一个外部的索引排序,建议优化,原因一般如下:order by的字段不是索引字段;select查询字段不全是索引字段;select查询字段都是索引字段,但order by字段和索引字段的顺序不一致。
using join buffer:使用了连接缓存;impossible where:where 语句查询不到数据;const row not found:目标表是空的;Deleting all rows:对于DELETE语句,例如 MyISAM 引擎支持以简单而快速的方式删除所有的数据;Distinct:查找distinct值,当找到第 1 个匹配的行后,停止查找;Impossible HAVING:HAVING 子句始终为 False;Impossible WHERE:WHERE 子句始终为 False;
基于此可以对比一下使用主键查询和不使用主键查询的差别。
explain SELECT * FROM p_subject_sort
explain SELECT * FROM p_subject_sort where id = 1

同时还可以添加联合索引提高查询效率,但如果在查询的时候,使用了其它函数操作,则索引失效,另一种情况是数据库查询的时候使用 != , <> , is null , is not null , like 关键字% 等也会导致索引失效,不过这些的前提是原来的查询就用到了索引。
SQL查询优化
基于上述内容,可得优化结论如下:
- 避免全表扫描,
type出现all,尽量在where,order by涉及的列上建立索引。 - 不要编写
select *,要明确查询字段; !=,<>,like模糊查询会导致全表扫描,如果无法避免,可以建立全文索引;- 遵循最左原则,例如在
where子句中写查询条件时,优先选择索引字段; - 能使用关联查询(LEFT JOIN)的尽量不要使用子查询,能不使用关联查询的就不要使用关联查询;
- 要习惯使用
limit限制查询条目。
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)