Mysql 执行计划分析

190 阅读2分钟

Explain 执行计划包括id,select_type,table,partitions,type,possible_keys,key,key_len,ref,rows,filtered,extra等字段内容。下面分别阐述各个字段的作用,及常见的输出类型详解

  1. id
  2. select_type
    • simple:查询语句中不包含union或者子查询的查询
    • primary:对于包含union union all或者子查询的大查询来说,最左边的查询的select type就是primary
    • materialized:当查询优化器在执行包含子查询的语句时,选择将子查询物化之后与外层查询进行连接查询,该子查询的select type就是materialized
  3. type
    • const:高效,根据主键或者唯一索引与常数进行等值匹配
    • eq_ref:高效,连接查询时,被驱动表如果是通过主键或者不允许为null的唯一索引进行等值匹配
    • ref:高效,通过普通的二级索引与常量进行等值匹配;连接查询中,被驱动表中的某个普通的二级索引与驱动表中某个列进行等值匹配
    • range:高效,使用索引获取某些单点扫描区间的记录
    • index:低效,需要扫描全部的索引记录
    • ALL:低效
  4. extra
    • Using index:使用覆盖索引查询时,显示该字段
    • Using index condition:有些搜索条件中虽然出现了索引列,但是却不能充当边界条件来形成扫描区间,也就是不能用来减少需要扫描的记录数量,将显示该字段。如果再查询语句的执行过程中使用索引下推,将显示该字段。
    • Using where:当某个搜索条件需要在server层进行判断时,将会提示该字段
    • Using join buffer(Block Nested Loop):在连接查询中,当被驱动表不能有效地利用索引加快访问速度时,mysql会为其分配一块名为连接缓冲区的内存块来加快查询速度
    • Using filesort:在很多情况下,排序操作无法使用到索引,只能在内存中或者磁盘中进行排序,称为文件排序
    • Using temporary:借助临时表来完成功能,如去重,排序。在执行distinct、group by、union等子句的查询过程中,如果不能有效地利用索引完成查询,mysql很有可能通过建立内部的临时表来执行查询