MySQL执行计划
EXPLAIN 语法
{EXPLAIN | DESCRIBE | DESC}
tbl_name [col_name | wild]{EXPLAIN | DESCRIBE | DESC} [explain_type]
{explainable_stmt | FOR CONNECTION connection_id}
explain_type: {
EXTENDED | PARTITIONS | FORMAT = format_name
}
format_name: {
TRADITIONAL | JSON
}
explainable_stmt: { SELECT statement | DELETE statement | INSERT statement | REPLACE statement | UPDATE statement
}
1. 使用EXPLAIN优化查询
EXPLAIN语句提供有关MySQL如何执行语句的信息:EXPLAIN适用于SELECT,DELETE,INSERT,REPLACE和UPDATE语句。
当EXPLAIN与可解释的语句一起使用时,MySQL会显示优化器中有关语句执行计划的信息。也就是说,MySQL解释了它将如何处理语句,包括有关表如何连接以及以何种顺序连接的信息。
当EXPLAIN与FOR CONNECTION connection_id将显示connection_id执行的语句的执行计划。
对于SELECT语句,EXPLAIN会生成可以使用SHOW WARNINGS显示的其他执行计划信息。
EXPLAIN对于检查涉及分区表的查询很有用。
FORMAT选项可用于选择输出格式。 TRADITIONAL以表格格式显示输出。如果没有显示定义FORMAT选项,则默认值为TRADITIONAL。 JSON格式以JSON格式显示信息。
在EXPLAIN的帮助下,可以看到应该向表添加索引的位置,以便通过使用索引查找行来更快地执行语句。还可以使用EXPLAIN来检查优化程序是否以最佳顺序连接表。要提示优化器使用与SELECT语句中命名表的顺序相对应的连接顺序,请使用SELECT STRAIGHT_JOIN而不是SELECT来开始语句。 (请参见“SELECT语法”。)但是,STRAIGHT_JOIN可能会阻止使用索引,因为它会禁用半连接转换。请参见“使用半连接转换优化子查询,派生表和视图引用”。
优化器trace有时可以提供与EXPLAIN的信息互补的信息。但是,优化程序跟踪格式和内容可能会在不同版本之间发生变化。有关详细信息,请参阅MySQL内部:跟踪优化程序。
如果在您认为应该使用索引时遇到问题,请运行ANALYZE TABLE以更新可能影响优化程序所做选择的表统计信息,例如key的基数。请参见“ANALYZE TABLE语法”。注意
EXPLAIN还可用于获取有关表中列的信息。 EXPLAIN tbl_name与DESCRIBE tbl_name和SHOW COLUMNS FROM tbl_name同义。
2. EXPLAIN输出格式
EXPLAIN语句提供有关MySQL如何执行语句的信息。 EXPLAIN适用于SELECT,DELETE,INSERT,REPLACE和UPDATE语句。
EXPLAIN为SELECT语句中使用的每个表返回一行信息。 它按照MySQL在处理语句时读取它们的顺序列出输出中的表。 MySQL使用嵌套循环连接方法解析所有连接。 这意味着MySQL从第一个表中读取一行,然后在第二个表,第三个表中找到匹配的行,依此类推。 处理完所有表后,MySQL会通过表列表输出所选列和回溯,直到找到有更多匹配行的表。 从该表中读取下一行,并继续下一个表。
EXPLAIN输出包括分区信息。 此外,对于SELECT语句,EXPLAIN生成扩展信息,可以使用EXPLAIN后的SHOW WARNINGS显示.【注意】
在较旧的MySQL版本中,使用EXPLAIN PARTITIONS和EXPLAIN EXTENDED生成分区和扩展信息。 这些语法仍然可以向后兼容,但默认情况下现在启用分区和扩展输出,因此PARTITIONS和EXTENDED关键字是多余的并且已弃用。 它们的使用会导致警告,并且在将来的MySQL版本中它们将从EXPLAIN语法中删除。
您不能在同一个EXPLAIN语句中一起使用已弃用的PARTITIONS和EXTENDED关键字。 此外,这些关键字都不能与FORMAT选项一起使用。
2.1 EXPLAIN输出列
mysql> explain select * from employees.t1 where t1.emp_no in (select emp_no from employees.salaries);+----+--------------+-------------+------------+--------+----------------+------------+---------+---------------------+---------+----------+-------------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+--------------+-------------+------------+--------+----------------+------------+---------+---------------------+---------+----------+-------------+| 1 | SIMPLE | t1 | NULL | ALL | NULL | NULL | NULL | NULL | 2837194 | 100.00 | Using where || 1 | SIMPLE | | NULL | eq_ref | | | 4 | employees.t1.emp_no | 1 | 100.00 | NULL || 2 | MATERIALIZED | salaries | NULL | index | PRIMARY,emp_no | emp_no | 4 | NULL | 2838426 | 100.00 | Using index |+----+--------------+-------------+------------+--------+----------------+------------+---------+---------------------+---------+----------+-------------+3 rows in set, 1 warning (