MySQL 优化器 explain
2022-02-03 21:51 / 浏览量:1686

MySQL 专门提供了一个 explain 语句让我们在执行查询语句之前可以先查看优化器使用的执行计划,从而根据返回结果对查询语句进行优化。




下面我们来简单的对 explain 语句返回结果的数据结构作一下解释:

  • id:查询序列号,标识执行顺序,SQL 语句中出现了几个 SELECT 关键字,就会分配几个查询 id,一般对于单表查询和连接查询,id 值都是 1,对于联合查询和子查询,id 值会有多个;

  • select_type:查询类型,主要是用于区分普通查询、联合查询、子查询等,其中 SIMPLE 表示普通查询(包含连接查询)、UNION 表示联合查询、SUBQUERY 表示子查询;

  • table:要执行查询的数据表;

  • partitions:表分区(通常不会用到,可忽略);

  • type:SQL 查询优化的重要指标,表示执行计划用到的索引类型,性能由高到低依次为:system > const > eq_ref > ref > range > index > ALL(以下是常见的类型值,不是所有):

    • system 表示系统表查询或者 MyISAM、Memory 引擎表中只包含一条记录;

    • const 表示常量查询,通常主键索引或者唯一索引的单表等值匹配查询就是这种类型,比如上述第一个 explain 语句得到的执行计划就是;

    • eq_ref 在连接查询中,被驱动表的主键索索引或唯一索引等值匹配会使用这个类型,后面我们介绍连接查询时会演示;

    • ref 通常对应二级索引的等值匹配查询,比如 b = 10000;

    • range 表示范围匹配,比如上述第二个 explain 语句得到的执行计划就是;

    • index 表示索引树扫描,通常 count 查询会应用这个计划;

    • ALL 表示全表扫描,性能最差,通过对于没有设置索引的列进行过滤就会进行全表扫描。

  • possible_keys:查询过程中有可能用到的索引;

  • key:查询时实际使用的索引,如果为 NULL,则表示没有使用索引;

  • key_len:索引长度,越小越好,整型通常是 4,字符串类型根据创建索引时指定的长度设定;

  • ref:表示表的连接匹配条件,即哪些列或常量被用于查找索引列上的值,对于 const 类型单表等值匹配而言,其值是 const,对于连接查询而言,就是被连接的列;

  • rows:返回估算的结果集行数,不一定准确;

  • filtered:表示返回结果的行数占需读取行数的百分比,越大越好;

  • extra:展示一些额外信息(以下只是常见的额外信息,不是所有):

    • Using index 表示使用了覆盖索引;

    • Using where 表示使用了 where 子句来过滤结果集;

    • Using filesort 表示查询过程中使用了文件排序,使用非索引列进行排序时出现,非常消耗性能,排序、分组查询时通常会用到;

    • Using temporary 表示查询过程中使用了临时表,分组、联合查询时通常会用到;

    • Using join buffer 表示连接查询时使用了 join buffer;

    • Start temporary, End temporary 表示 IN 子查询转化为 semijoin 时使用了 DuplicateWeedout 策略;

    • LooseScan 表示 IN 子查询转化为 semijoin 时使用了 LooseScan 策略;

    • FirstMatch 表示 IN 子查询转化为 semijoin 时使用了 FirstMatch 策略。


    如果你遇到查询速度很慢的的情况,可以尝试用explain执行下你的mysql语句,根据返回结果,设置合适的索引或优化查询语句,希望这篇对explain的简单介绍对你有帮助。