EXPLAIN的基本介绍
关于MySQL的优化,我们首先要了解explain这个东西。explain能够帮助我们来查看我们所写的SQL的内部执行计划,包括是否使用索引、有没有做全表扫描等等,让我们能更好地了解自己编写的SQL。
我们深入了解MySQL的基于开销的优化器,可以获得很多可能被优化器考虑到的访问策略的细节,以及当我们编写的SQL在何种情况下不会被优化器所采用。
explain的用法
explain的用法:在我们要查询的SQL之前加上该关键字,注意要是查询SQL
。
用法如下所示:
EXPLAIN
SELECT * FROM iot_product_discount pd
WHERE pd.`id` = "7b8bab6e4d6c4e6ba4bfcac40349ca33";
接上篇,这篇将继续介绍余下的属性
6. possible_keys
possible_keys的意思为:MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用。
该列完全独立于EXPLAIN输出所示的表的次序。这意味着在possible_keys中的某些键实际上不能按生成的表次序使用。如果该列是NULL,则没有相关的索引。
在这种情况下,可以通过检查where子句看是否它引用某些列或适合索引的列来提高你的查询性能。如果是这样,创造一个适当的索引并且再次用explain检查语句。
7.keys
key列显示MySQL实际决定使用的键(索引)。
如果没有索引,键是NULL。想要强制MySQL使用或者忽略possible_keys列中的索引,在查询中使用FORCE_INDEX、USE INDEX或者IGNORE INDEX
。
8.key_length
表示索引中使用的字节数,可通过该列计算查询中使用的索引长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的)。
在不损失精度的情况下,长度越短越好。
9.ref
表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值。
10.rows
表示MySQL根据表统计及索引选用情况,估算的找到所需的记录所需要读取的行数。
是个简单且重要的参考值,数值越大说明性能越差,说明没有用好索引。
11.Extra
该列包含MySQL解决查询的详细信息,有以下几种情况:
- Using where
列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部请求列都是同一个索引,表示MySQL服务器将在存储引擎检索后再进行过滤。
我们可以和下面的Using index来做对比
。两者的区别的是remark字段是非索引字段。
- Using index
列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部请求列都是同一个索引,表示MySQL服务器将在存储引擎检索后再进行过滤。
我们可以和上面的Using where来做对比
。两者的区别的pool_no为索引字段。
-
Using temporary
表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询。出现该语句说明,是要考虑一下优化性能。 -
Using filesort
MySQL中无法利用索引完成的排序操作成为文件排序
。 -
Using join buffer
该值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果。如果出现了该值,那应该注意,根据查询的具体情况可能需要添加索引来改进性能。 -
Impossible where
这个值强调了where语句会导致没有符合条件的行。 -
Select tables optimized away
这个值意味着仅通过使用索引,优化器可能从聚合函数结果中返回一行。
总结
1. explain 不会告诉你关于触发器、存储过程的信息或用户自定义函数对查询的影响情况。
2. explain 不会考虑到各种cache缓存。
3. explain 不能显示MySQL在执行查询时所作的优化工作。
4. 部分统计信息是估值,并非精确值。
5. explain只能解释select操作,其他操作要重写为select 后查看执行计划。