MySQL 执行计划 EXPLAIN

执行计划官方文档:https://dev.mysql.com/doc/refman/5.7/en/explain.html

语法

  1. {EXPLAIN | DESCRIBE | DESC}
  2. tbl_name [col_name | wild]
  3. {EXPLAIN | DESCRIBE | DESC}
  4. [explain_type]
  5. {explainable_stmt | FOR CONNECTION connection_id}
  6. explain_type: {
  7. EXTENDED
  8. | PARTITIONS
  9. | FORMAT = format_name
  10. }
  11. format_name: {
  12. TRADITIONAL
  13. | JSON
  14. }
  15. explainable_stmt: {
  16. SELECT statement
  17. | DELETE statement
  18. | INSERT statement
  19. | REPLACE statement
  20. | UPDATE statement
  21. }
  • EXPLAIN 是解释 SQL 语句的执行计划,即显示该 SQL 语句怎么执行的。
    • DESC 命令也可以查看执行计划。
  • 5.6 版本支持 DML 语句进行 EXPLAIN 解释。
  • 5.6 版本开始支持 JSON 格式的输出。

注意:EXPLAIN 查看的是执行计划,做 SQL 解析,不会去真的执行,且到 MySQL 5.7 以后子查询也不会去执行。

EXTENDED 参数

  1. mysql> explain extended select * from test_index_2 where b > 1 and b < 3\G
  2. *************************** 1. row ***************************
  3. id: 1
  4. select_type: SIMPLE
  5. table: test_index_2
  6. partitions: NULL
  7. type: ALL
  8. possible_keys: NULL
  9. key: NULL
  10. key_len: NULL
  11. ref: NULL
  12. rows: 6
  13. filtered: 16.67
  14. Extra: Using where
  15. 1 row in set, 2 warnings (0.00 sec) warnings,这里相当于提供一个信息返回
  16. mysql> show warnings\G
  17. *************************** 1. row ***************************
  18. Level: Warning
  19. Code: 1681
  20. Message: 'EXTENDED' is deprecated and will be removed in a future release. -- 即将被弃用
  21. *************************** 2. row *************************** -- 显示真正的执行语句
  22. Level: Note
  23. Code: 1003
  24. 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))
  25. 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 可以图形化的展示执行计划。
图片.png

  1. mysql> explain format=json select * from test_index_2 where b >1 and b < 3\G
  2. *************************** 1. row ***************************
  3. EXPLAIN: {
  4. "query_block": {
  5. "select_id": 1,
  6. "cost_info": {
  7. "query_cost": "2.20" -- 总成本
  8. },
  9. "table": {
  10. "table_name": "test_index_2",
  11. "access_type": "ALL",
  12. "rows_examined_per_scan": 6,
  13. "rows_produced_per_join": 1,
  14. "filtered": "16.67",
  15. "cost_info": {
  16. "read_cost": "2.00",
  17. "eval_cost": "0.20",
  18. "prefix_cost": "2.20",
  19. "data_read_per_join": "16"
  20. },
  21. "used_columns": [
  22. "a",
  23. "b",
  24. "c"
  25. ],
  26. "attached_condition": "((`burn_test`.`test_index_2`.`b` > 1) and (`burn_test`.`test_index_2`.`b` < 3))"
  27. }
  28. }
  29. }
  30. 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 来源:殷建卫 - 架构笔记 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。