> 文章列表 > MySQL运维06-EXPLAIN工具

MySQL运维06-EXPLAIN工具

MySQL运维06-EXPLAIN工具

文章目录

  • EXPLAIN语法
  • EXPLAIN示例
  • EXPLAIN输出内容说明
  • MySQL执行计划的局限性
  • 总结

EXPLAIN语法

  1. 使用EXPLAIN工具可以确认执行计划是否良好,查询是否走了合理的索引。语法形式类似如下语句:
EXPLAIN SELECT……
  1. EXPLAIN命令还有如下两种变体

  2. 变体一、EXPLAIN EXTENDED:extended 扩展能够在原本explain的基础上额外的提供一些查询优化的信息,这些信息可以通过mysql的show warnings命令得到。

EXPLAIN EXTENDED SELECT……
  1. 变体二:EXPLAIN PARTITIONS:用于分区表的EXPLAIN命令。
EXPLAIN PARTITIONS SELECT……

EXPLAIN示例

如下是一个显示执行计划的例子:

EXPLAIN SELECT a.api_name, b.remarksFROM (SELECT t1.api_name,t1.apiserv_name,t1.app_id FROM t1 WHERE t1.total_count IN (10, 20)) AS a, t2 AS bWHERE a.api_name=b.api_nameGROUP BY a.app_id, b.app_idORDER BY b.app_id;

MySQL运维06-EXPLAIN工具

EXPLAIN输出内容说明

MySQL运维06-EXPLAIN工具
MySQL运维06-EXPLAIN工具

MySQL执行计划的局限性

  1. EXPLAIN不会告诉你关于触发器、存储过程的信息或用户自定义函数对查询的影响情况。
  2. EXPLAIN不考虑各种Cache。
  3. EXPLAIN不能显示MySQL在执行查询时所做的优化工作。
  4. 部分统计信息是估算的,并非精确值。
  5. MySQL 5.6之前EXPALIN只能解释SELECT操作,其他操作需要重写为SELECT后才能查看执行计划。
  6. 如果FROM子句里有子查询,那么MySQL可能会执行这个子查询,如果有昂贵的子查询或使用了临时表的视图,那么EXPLAIN其实会有很大的开销。

总结

  1. 通过EXPLAIN可以查看SQL语句的执行计划,主要要看:
    1. 通过type列看是否用到索引,优劣顺序如右:const/system(常量查询) > eq_ref(唯一索引扫描) > ref(非唯一索引扫描) > range(索引范围扫描) > index(全索引遍历) > ALL(全表遍历)
    2. extra列查看是否使用了文件排序(using filesort)和临时表特别是文件临时表。
  2. EXPLAIN的局限性在于没有考虑Cache,也没有考虑触发器、存储过程、UDF等情况,很多统计信息时估算的不是精确值。