转载:MySQL EXPLAIN 命令详解学习

转载自: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 = 16102176\G;
 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命令,查看索引的使用情况,帮助优化。

猜你喜欢

转载自www.cnblogs.com/mySummer/p/10687380.html