MySQL explain 执行计划学习一下吧,MySQL优化学习第3天

举报
梦想橡皮擦 发表于 2022/01/14 08:09:43 2022/01/14
【摘要】 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:查询类型,一般有 SIMPLEPRIMARYUNIONSUBQUERY
  • 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_subqueryin 语句包含一个查询主键字段的查询;
  • index_subqueryin 语句后面是非唯一索引字段的查询;
  • range :范围查询,一般在 where 语句使用了 between<>in
  • index :数据是通过查询索引得到的数据;
  • all:全表扫描。

要保证 sql 查询,一般要达到 rangeref 级别。

上述列名 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 nullis not nulllike 关键字% 等也会导致索引失效,不过这些的前提是原来的查询就用到了索引。

SQL查询优化
基于上述内容,可得优化结论如下:

  • 避免全表扫描,type 出现 all,尽量在 whereorder by 涉及的列上建立索引。
  • 不要编写 select *,要明确查询字段;
  • !=<>like 模糊查询会导致全表扫描,如果无法避免,可以建立全文索引;
  • 遵循最左原则,例如在 where 子句中写查询条件时,优先选择索引字段;
  • 能使用关联查询(LEFT JOIN)的尽量不要使用子查询,能不使用关联查询的就不要使用关联查询;
  • 要习惯使用 limit 限制查询条目。
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。