#夏日挑战赛# MySQL explain 执行计划学习一下吧,MySQL优化学习 原创

梦想橡皮擦
发布于 2022-7-13 15:08
浏览
2收藏

「本文正在参加星光计划3.0–夏日挑战赛」

explain(执行计划) 命令

使用 explain 命令可以查看 SQL 执行的具体细节。
例如:

explain SELECT * FROM `表名称`

得到如下结果

#夏日挑战赛# MySQL explain 执行计划学习一下吧,MySQL优化学习-鸿蒙开发者社区

其中各个参数的含义分别是

  • 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

#夏日挑战赛# MySQL explain 执行计划学习一下吧,MySQL优化学习-鸿蒙开发者社区

同时还可以添加联合索引提高查询效率,但如果在查询的时候,使用了其它函数操作,则索引失效,另一种情况是数据库查询的时候使用 !=<>is nullis not nulllike 关键字% 等也会导致索引失效,不过这些的前提是原来的查询就用到了索引。

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

  • 避免全表扫描,type 出现 all,尽量在 whereorder by 涉及的列上建立索引。
  • 不要编写 select *,要明确查询字段;
  • !=<>like 模糊查询会导致全表扫描,如果无法避免,可以建立全文索引;
  • 遵循最左原则,例如在 where 子句中写查询条件时,优先选择索引字段;
  • 能使用关联查询(LEFT JOIN)的尽量不要使用子查询,能不使用关联查询的就不要使用关联查询;
  • 要习惯使用 limit 限制查询条目。

记录时间

今天是持续写作的第 <font color=red>285</font> / 365 天。
可以<font color=#04a9f4>关注</font>我,<font color=#04a9f4>点赞</font>我、<font color=#04a9f4>评论</font>我、<font color=#04a9f4>收藏</font>我啦。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
6
收藏 2
回复
举报
4条回复
按时间正序
/
按时间倒序
idezhen
idezhen

坚持打卡,一键三连

回复
2022-7-14 09:22:38
发量迷人的乔喻
发量迷人的乔喻

擦姐,更新啦

回复
2022-7-14 09:24:25
mb623c82b71202b
mb623c82b71202b

打卡

回复
2022-7-25 11:26:55
新菜鸟儿
新菜鸟儿

打卡

回复
2022-7-25 11:28:09
回复
    相关推荐