MySQL优化—Explain中Type和Extra的含义

一、Explain前言

如之前的文章中所说,我们的SQL在交给执行引擎之前,是要经过查询优化器的。我们如何知道查询优化器是如何优化我们的SQL的,那就要用到explain这个关键字了。

常规的用explain查询出的字段意义,本文不会详说,可以参考之前的文章。本文重点讲述容易被我们忽略和混淆的一些重点。

二、show warnings

当我们在执行了explain之后,紧跟着执行show warnings,会得出优化后的查询语句,很好用。

三、id的意义

id越大,那么是越先执行的语句。

id相同,执行的顺序从上到下。

四、select_type字段的特殊意义

如果是单表的select查询,那么是simple

复杂查询最外层的select,就是primary

如果我们的SQL语句中有from子句,这时候的是derived

子查询,但是不是from的子句,那么就是subquery

在union中的第二个查询,是union

如果是从临时表中检索union的结果,那没事union result的。

五、type字段

这个是我们务必要记住的。system > const > eq_ref > ref > range > index > all。

我们的查询语句最好可以在range及其以上的级别。

六、ken_len字段

varchar(n)的长度是3n+2,其中2个字节用来存储字符串长度。

如果此字段允许为空,那么就是3n+3个字节了,因为需要1个字节来存储此字段是否为NULL的标志。

时间类型的字段的长度:

  • date:3字节。
  • timestamp:4字节。
  • datetime:8字节。

七、Extra字段

常出现的extra字段如下,除了Using index不用优化,其他情况需要针对性的优化。

where的条件 select的字段 extra
是索引前导列 被索引覆盖 Using index
索引前导列 被索引覆盖 Using where
是索引列之一,但不是索引前导列 被索引覆盖 Using where Using index
索引前导列的范围 不被索引覆盖 Using index condition
Using temporary
Using filesort

八、总结

我们在优化SQL的时候,主要是参考type字段与extra字段。

  1. type字段是看where后面的条件是否使用了索引。type字段最好在range级别及其比他高的级别。
  2. extra字段是综合where子句和select的字段来一起判断的。其中Using index是高性能的。其他的情况可以酌情优化。尤其是临时表和文件排序的,要重点进行优化。注意select字段是否能覆盖索引。

你可能感兴趣的:(MySql)