MySQL 执行计划 EXPLAIN
执行计划官方文档:https://dev.mysql.com/doc/refman/5.7/en/explain.html
语法
{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}
- EXPLAIN 是解释 SQL 语句的执行计划,即显示该 SQL 语句怎么执行的。
- DESC 命令也可以查看执行计划。
 
 - 5.6 版本支持 DML 语句进行 EXPLAIN 解释。
 - 5.6 版本开始支持 JSON 格式的输出。
 
注意:EXPLAIN 查看的是执行计划,做 SQL 解析,不会去真的执行,且到 MySQL 5.7 以后子查询也不会去执行。
EXTENDED 参数
mysql> explain extended select * from test_index_2 where b > 1 and b < 3\G*************************** 1. row ***************************id: 1select_type: SIMPLEtable: test_index_2partitions: NULLtype: ALLpossible_keys: NULLkey: NULLkey_len: NULLref: NULLrows: 6filtered: 16.67Extra: Using where1 row in set, 2 warnings (0.00 sec) 有 warnings,这里相当于提供一个信息返回mysql> show warnings\G*************************** 1. row ***************************Level: WarningCode: 1681Message: 'EXTENDED' is deprecated and will be removed in a future release. -- 即将被弃用*************************** 2. row *************************** -- 显示真正的执行语句Level: NoteCode: 1003Message: /* select#1 */ select `burn_test`.`test_index_2`.`a` AS `a`,`burn_test`.`test_index_2`.`b` AS `b`,`burn_test`.`test_index_2`.`c` AS `c` from `burn_test`.`test_index_2` where ((`burn_test`.`test_index_2`.`b` > 1) and (`burn_test`.`test_index_2`.`b` < 3))2 rows in set (0.00 sec)
EXTENDED 即将被弃用,在执行 EXPLAIN 的时候可以不使用该参数。
SHOW WARNINGS; 命令可以查看当前语句真正的执行内容。
FORMAT 参数
FORMAT 参数可以格式化 EXPLAIN 的输出,比如格式化成 JSON 格式(FORMAT = JSON)。当使用 JSON 个格式的时候,会显示一些其他有用的信息,比如 SQL 的执行成本。
在 MySQL 5.6 版本之后,使用 MySQL Workbench 中的 Visual Explain 可以图形化的展示执行计划。
mysql> explain format=json select * from test_index_2 where b >1 and b < 3\G*************************** 1. row ***************************EXPLAIN: {"query_block": {"select_id": 1,"cost_info": {"query_cost": "2.20" -- 总成本},"table": {"table_name": "test_index_2","access_type": "ALL","rows_examined_per_scan": 6,"rows_produced_per_join": 1,"filtered": "16.67","cost_info": {"read_cost": "2.00","eval_cost": "0.20","prefix_cost": "2.20","data_read_per_join": "16"},"used_columns": ["a","b","c"],"attached_condition": "((`burn_test`.`test_index_2`.`b` > 1) and (`burn_test`.`test_index_2`.`b` < 3))"}}}1 row in set, 1 warning (0.00 sec)
执行计划输出列
官方文档:https://dev.mysql.com/doc/refman/5.7/en/explain-output.html
执行计划输出列的详细内容在下一章说明,这里先大概了解一下每列的显示内容。
| 列 | 含义 | 
|---|---|
| id | 执行计划的 id 标志 | 
| select_type | SELECT 的类型 | 
| table | 输出记录的表 | 
| partitions | 匹配的分区 | 
| type | JOIN 的类型 | 
| possible_keys | 优化器可能选择的索引 | 
| key | 优化器实际选择的索引 | 
| key_len | 使用索引的字节长度 | 
| ref | 进行比较的索引列 | 
| rows | 优化器预估的记录数量 | 
| filtered | 根据条件过滤得到的记录的百分比 | 
| extra | 额外的显示选项 | 
作者:殷建卫 链接:https://www.yuque.com/yinjianwei/vyrvkf/wgdwll 来源:殷建卫 - 架构笔记 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
