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: 1
select_type: SIMPLE
table: test_index_2
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 6
filtered: 16.67
Extra: Using where
1 row in set, 2 warnings (0.00 sec) 有 warnings,这里相当于提供一个信息返回
mysql> show warnings\G
*************************** 1. row ***************************
Level: Warning
Code: 1681
Message: 'EXTENDED' is deprecated and will be removed in a future release. -- 即将被弃用
*************************** 2. row *************************** -- 显示真正的执行语句
Level: Note
Code: 1003
Message: /* 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 来源:殷建卫 - 架构笔记 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。