MySQL 执行计划

1. 执行计划的定义

什么是执行计划(查询计划) 呢? 执行计划就是一系列的操作步骤。 SQL是声明性语言, 它只告诉数据库要查询什么, 但并不告诉数据库如何去查。数据库所要做的就是基于算法和统计信息计算出一条最佳的访问路径。 这个工作是由优化器来完成的。 优化器会比较不同的执行计划, 然后选择其中最优的一套。

 2. 怎样确认执行计划是否良好

无论是做研发还是DBA, 都有必要学会EXPLAIN工具的使用。 使用EXPLAIN工具可以确认执行计划是否良好, 查询是否走了合理的索引。 不同版本的MySQL优化器各有不同, 一些优化规则随着版本的发展可能会有变化, 查询的执行计划随着数据的变化也可能会有变化。 对于这类情况可以使用EXPLAIN来验证自己的判断。

3. Explain命令

3.1 explain命令的两种格式

1)EXPLAIN EXTENDED SELECT……

命令说明:

此命令将执行计划“反编译”成SELECT语句, 运行SHOW WARNINGS可得到被MySQL优化器优化后的查询语句。

 案例:

EXPLAIN EXTENDED
SELECT gi.*, ig.*
FROM  gi
LEFT JOIN ig ON gi.foreignkey = ig.primarykey;

产生的结果如下图:

MySQL 执行计划

2)EXPLAIN PARTITIONS  ....

命令说明:

用于分区表的EXPLAIN命令。

案例:

EXPLAIN PARTITIONS
SELECT gi.*, ig.name
FROM  gi
LEFT JOIN ig ON gi.id= ig.id;

产生的结果如下图:

MySQL 执行计划

4.执行计划的局限

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

-- SinoKnots 著于2018-02-03