MySQL SQL语句执行效率分析

前言

今天在掘金看到了一篇关于SQL优化的文章(原文在此),了解到了Explain工具。本文则是对Explain工具的学习和总结。

SQL语句性能分析工具Explain

Explain的作用是生成一个QEP(查询执行计划),可以帮助我们在不真正执行SQL的情况下,就能看到SQL怎样执行。

执行以下语句:

EXPLAIN SELECT * FROM t_options WHERE `name` IS NOT NULL GROUP BY `name`   

得到如下结果:

SQL执行结果

对于返回信息,主要关注点在如下几个字段:

  1. Type
    ALL是全表扫描,效率低;其它的index、range、const、ref、system则是比较好的。

  2. Possible_keys
    可能被用到的索引

  3. Key
    查询过程中用到的索引,当为null时,表示没有使用索引,通常是不好的。

  4. ken_len
    索引字段最大可能使用的长度,也叫索引基数。索引基数越大,表示可能查询的行数越多,查询效率越低。

  5. Rows
    MySQL估计的需要扫描的行数,只是估计,越多表示查询的行数越大,自然越慢。

  6. Extra
    显示上述信息之外的其它信息,非常重要。其主要有一下返回结果。

    Usingindex

    表明此查询使用了覆盖索引(CoveringIndex),即通过索引就能返回结果,无需访问表。(覆盖索引是一种非常优秀的索引,其使用见http://blog.csdn.net/hzy38324/article/details/44857721)
    

若没显示"Usingindex"表示读取了表数据。
Usingindex condition

    可能会使用索引    

Usingwhere    

    表示 MySQL 服务器先读取整行数据,再检查此行是否符合 where 句的条件,符合就留下,不符合便丢弃。效率较慢。
Usingfilesort    

    表示Mysql会按查询所需的顺序对结果进行排序,这时就会出现 Usingfilesort 。排序自然会增加查询时间,导致效率变慢。解决方法是利用索引进行排序。若查询所需的排序与使用的索引的排序一致,因为索引是已排序的,因此按索引的顺序读取结果返回,此时就不会出现Using filesort。

关于“Using index” 和 “Using index condition”的区别,笔者参考了一下stackoverflow上的一篇文章
简单的说
Using index就是一定使用索引,这种索引成为覆盖索引,Using index condition则是在必要的时候才使用索引
怎样才能让Usingindex condition变成Using index,答案自然是创建一个覆盖索引,同样,笔者将会在之后章节介绍覆盖索引如何创建。

参考链接: CSDN