概述:


每个列的含义:

id

select的优先级

  • 每个查询的优先级
  • id越大优先级越高

    select_type

    select查询的类型

  • simple:简单查询

  • primary:复杂查询的最外层
  • subquery:包含在select中的子查询
  • derived:包含在from子句中的子查询。(查询结果会放在临时表)

table

查询的表

  • 当前访问的表
  • 如果是子查询的表是,N表示当前查询的id

type

查询的姿势

  • 表示关联类型或访问类型,即MySQL如何查找表中的行
  • 效率从最优到最差分别为:

    • System > const > eq_ref > ref > range > index > all

      null
    • 如果type为null,表示根本不需要查表,

    • 比如查找索引中最小值

      system
    • 表示对某部分进行优化将其转化成一个常量,

    • 比如表里只有一条数据时

      const
    • 常数级的复杂度

    • 比如直接等于查主键id

      eq_ref
    • primary key 或 unique key 索引的所有部分被连接使用 ,最多只会返回一条符合条件的记录。

    • 比如外连接唯一索引项等值查询

      ref
    • 相比上个 eq_ref 不使用唯一索引

      range
    • 使用索引进行范围扫描

    • 比如 in, between ,<,<等操作

      index
    • 扫描全索引就能拿到结果,一般是扫描二级索引。

    • 其实就是在索引项上的全文扫描,
    • 这种需要优化的

      all
    • 全表扫描

    • 一条一条数据的查

possible_key

可能用到的索引项

key

实际采用的索引

  • 如果为null表示没有使用索引
  • 如果想强制使用某个索引用 force index
  • 如果想强制不适用某个索引用 ignore index

key_len

索引里使用的字节数

  • 索引里使用的字节数
  • 可以通过这个值算出具体使用了索引中的哪些列
  • 索引最大长度为768字节,当字符串过长时,mysql会做一个类似做前缀索引的处理,将前半部分的字符提取出来做索引。
  • 计算规则:
    • 字符串:
      • char(n):字节长度
      • varchar(n):如果是utf-8,则长度 3n+2 字节,假的2字节用来存储字节长度
    • 数值类型
      • tinyint:1字节
      • smallint:2字节
      • int:4字节
      • bigint:8字节
    • 时间类型
      • date:3字节
      • timestamp:4字节
      • datetime:8字节
    • 如果字节允许为null,需要亿字节记录是否为null

ref

查询索引时表查找值所用到的列或常量

  • 在key列记录的索引中,表查找值所用到的列或常量
  • 常见的有:const(常量),字段名

rows

估算要读取并检测的行数

Extra

额外信息

  • 展示的额外信息
  • 重要的值有:

    Using index
    • 使用覆盖索引
    • 覆盖索引:
    • mysql执行计划explain结果里的key有使用索引,如果select后面查询的字段都可以从这个索引的树中获取,这种情况一般可以说是用到了覆盖索引,extra里一般都有using index;覆盖索引一般针对的是辅助索引,整个查询结果只通过辅助索引就能拿到结果,不需要通过辅助索引树找到主键,再通过主键去主键索引树里获取其它字段值

      Using where
    • 使用where语句来处理结果,并且查询的列未被索引覆盖

Using index condition

  • 查询的列不完全被索引覆盖,where条件中是一个前导的范围

    Using temporary
  • mysql需要创建一张临时表来处理查询。出现这种情况一般是要进行优化的,首先是想到用索引来优化。

  • 比如 distinct

    Using filesort
  • 将用外部排序,而不是索引排序数据较小时从内存排序,否则需要在磁盘完成排序。这种情况下一般也是要考虑使用索引来优化的

    Select tables optimized away
  • 使用聚合函数来访问存在索引的某个字段