Skip to main content

查询分析

EXPLAIN

EXPLAIN SELECT * FROM `resource_device_expand`
idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
1SIMPLEresource_device_expandALL58100.00

查询字段详解

id

  • 每出现一个select分配一个id
  • union因为要去重,会创建临时表
  • Union all 在5.6之前可能也会用到临时表

select_type

  • SUBQUERY
    • SELECT列表中的子查询中的SELECT
  • DERIVED
    • FROM子句的子查询中的SELECT(派生
  • UNION
    • UNION中的第二个和随后的SELECT
  • UNION RESULT

table

  • 每条记录对应着某个单表的访问方法

partitions

  • 表示查询时扫描的分区,如果没有使用分区表,则为 NULL

type

  • ALL
    • 全表扫描
  • index
    • 全表扫描,只扫描了索引树
      • 覆盖索引,且条件满足所有数据
      • 用到了索引(主键)排序,ses index没有出现在 Extra列中
    • 查询列在二级索引上
  • range
    • 范围查找
    • 多个单点扫描或范围扫描
  • ref
    • 精确索引查找,匹配多条
    • 使用非唯一索引等值查询时,每个索引项对应多行数据,因此查询执行时需要读取多次数据
  • eq_ref
    • 精确索引查找,匹配一条
    • 使用唯一索引或主键等值查询时,每个表只有一行匹配,因此查询执行时只需要读取一次数据。
  • system
    • 查询只返回一行结果,因此只需读取系统表的一行数据。
  • const
    • 使用常数值进行比较时,MySQL 可以在查询执行过程中将查询结果缓存到一个常数值中。在这种情况下,MySQL 只需要读取一次数据,并使用常数值进行比较。
    • 主键定位一条记录
    • 唯一二级索引定位一条记录

key

  • 用到的索引

key_len

  • 索引用到的字节数

ref

  • 索引和表之间的关系
  • 表示在联接查询或子查询中,如何将前一个表的输出行与后一个表的索引行匹配。

rows

  • 在执行查询时估算的每个操作要读取的行数

filtered

  • 表示返回结果的行占总行数的比例

Extra

  • Using index
    • 使用覆盖索引
  • index
    • 全表扫描,只扫描了索引树
  • UNION
    • UNION中的第二个和随后的SELECT
  • UNION RESULT
  • Using filesort
    • 使用了排序
  • Block Nested Loop
    • join的一种,被驱动无索引
  • using MRR
    • 使用了回表之前主键排序的优化
  • Using temporary
    • 用到了临时表,union的时候