转载自:https://blog.csdn.net/mchdba/article/details/9190771
MySQL EXPLAIN 命令详解
MySQL的EXPLAIN命令用于SQL语句的查询执行计划(QEP)。这条命令的输出结果能够让我们了解MySQL 优化器是如何执行
SQL 语句的。这条命令并没有提供任何调整建议,但它能够提供重要的信息帮助你做出调优决策。
1 语法
MySQL 的EXPLAIN 语法可以运行在SELECT 语句或者特定表上。如果作用在表上,那么此命令等同于DESC 表命令。UPDATE
和DELETE 命令也需要进行性能改进,当这些命令不是直接在表的主码上运行时,为了确保最优化的索引使用率,需要把它们改
写成SELECT 语句(以便对它们执行EXPLAIN 命令)。请看下面的示例:
1 UPDATE table1 2 SET col1 = X, col2 = Y 3 WHERE id1 = 9 4 AND dt >= '2010-01-01';
这个UPDATE语句可以被重写成为下面这样的SELECT语句:
1 SELECT col1, col2 2 FROM table1 3 WHERE id1 = 9 4 AND dt >= '2010-01-01';
在5.6.10版本里面,是可以直接对dml语句进行explain分析操作的.
MySQL 优化器是基于开销来工作的,它并不提供任何的QEP的位置。这意味着QEP 是在每条SQL 语句执行的时候动态地计
算出来的。在MySQL 存储过程中的SQL 语句也是在每次执行时计算QEP 的。存储过程缓存仅仅解析查询树。
2 各列详解
MySQL EXPLAIN命令能够为SQL语句中的每个表生成以下信息:
1 mysql> EXPLAIN SELECT * FROM inventory WHERE item_id = 16102176G; 2 ********************* 1. row *********************** 3 id: 1 4 select_type: SIMPLE 5 table: inventory 6 type: ALL 7 possible_keys: NULL 8 key: NULL 9 key_len: NULL 10 ref: NULL 11 rows: 787338 12 Extra: Using where
这个QEP 显示没有使用任何索引(也就是全表扫描)并且处理了大量的行来满足查询。对同样一条SELECT 语句,一个优化过的QEP 如下所示:
1 ********************* 1. row *********************** 2 id: 1 3 select_type: SIMPLE 4 table: inventory 5 type: ref 6 possible_keys: item_id 7 key: item_id 8 key_len: 4 9 ref: const 10 rows: 1 11 Extra:
在这个QEP 中,我们看到使用了一个索引,且估计只有一行数据将被获取。
-----------------------------------------------------------我写的:
从上边的例子大概能看出来执行结果每一项的含义,所以我暂时没有把每一项的解析copy过来。
比如加了一个索引,但是索引失效导致全表查的情况也不少,为了验证和优化索引,可以用explain命令,查看索引的使用情况,帮助优化。