MySQL运维06-EXPLAIN工具
文章目录
- EXPLAIN语法
- EXPLAIN示例
- EXPLAIN输出内容说明
- MySQL执行计划的局限性
- 总结
EXPLAIN语法
- 使用EXPLAIN工具可以确认执行计划是否良好,查询是否走了合理的索引。语法形式类似如下语句:
EXPLAIN SELECT……
-
EXPLAIN命令还有如下两种变体。
-
变体一、EXPLAIN EXTENDED:extended 扩展能够在原本explain的基础上额外的提供一些查询优化的信息,这些信息可以通过mysql的show warnings命令得到。
EXPLAIN EXTENDED SELECT……
- 变体二: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;
EXPLAIN输出内容说明
MySQL执行计划的局限性
- EXPLAIN不会告诉你关于触发器、存储过程的信息或用户自定义函数对查询的影响情况。
- EXPLAIN不考虑各种Cache。
- EXPLAIN不能显示MySQL在执行查询时所做的优化工作。
- 部分统计信息是估算的,并非精确值。
- MySQL 5.6之前EXPALIN只能解释SELECT操作,其他操作需要重写为SELECT后才能查看执行计划。
- 如果FROM子句里有子查询,那么MySQL可能会执行这个子查询,如果有昂贵的子查询或使用了临时表的视图,那么EXPLAIN其实会有很大的开销。
总结
- 通过EXPLAIN可以查看SQL语句的执行计划,主要要看:
- 通过type列看是否用到索引,优劣顺序如右:const/system(常量查询) > eq_ref(唯一索引扫描) > ref(非唯一索引扫描) > range(索引范围扫描) > index(全索引遍历) > ALL(全表遍历)
- extra列查看是否使用了文件排序(using filesort)和临时表特别是文件临时表。
- EXPLAIN的局限性在于没有考虑Cache,也没有考虑触发器、存储过程、UDF等情况,很多统计信息时估算的不是精确值。