explain详解

explain详解

  • explain
  • explain extended(5.7以前的版本)
  • expain partitions(5.7以前的版本)
  • show warnings:经过mysql优化的语句。

explain结果说明

  • id:执行顺序,id越大执行优先级越大

  • select_type:

    1. subquery:子查询

    2. primary:复杂查询最外层的查询

    3. derived :包含from语句中的子查询。

  • table:查询的表名称

  • type:访问类型,MYSQL如何查询表中的行,查询数据的大概范围。

    最优到最差:system>const>eq_ref>ref>range>index>ALL

    1. ALL:全表扫描
    2. index:扫描全索引就能拿到结果,一般都是二级索引。
    3. range:扫描范围一般是in ,between,> < =等范围查找
    4. ref:相比eq_ref,不使用唯一索引,而是使用普通索引或者唯一索引的部分前缀。
    5. eq_ref:主键或关联
    6. const:像常量查询一样,效率特别高,例如主键查询。
    7. system:表里只有一条元组匹配时为system。
    8. NULL:.执行节点不访问表和索引
  • key:mysql采用哪个索引来优化对该表的访问,如果没有走索引,则为NULL.

    可以强制使用索引force index,忽略索引ignore index。

  • possible_keys

  • key_len

    key_len计算规则:

    字符串

    char(n)和varchar(n),5.0.3以后版本中,**n均代表字符数,而不是字节数,**如果是utf-8,一个数字 或字母占1个字节,一个汉字占3个字节。

    char(n):如果存汉字长度就是 3n 字节

    varchar(n):如果存汉字则长度是 3n + 2 字节,加的2字节用来存储字符串长度,因为

    varchar是变长字符串

    数值类型

    int:1字节

    smallint:2字节

    int:4字节

    bigint:8字节

    时间类型

    date:3字节

    timestamp:4字节

    datetime:8字节

    如果字段允许为 NULL,需要1字节记录是否为 NULL

索引最大长度是768字节,当字符串过长时,mysql会做一个类似左前缀索引的处理,将前半部分的字符提取出来做索引。

  • ref:表查找所用到的列或者常量。

  • rows:mysql估计要读取检测的行数。

  • extra列:

    • using index:使用覆盖索引

      覆盖索引:select查询的字段都可以从查询的索引树中获取,这种情况称之为覆盖索引,extra里面一般为 useing index。

    • using where:使用where语句来处理结果,并且查询的列违背索引覆盖,这种语句可能需要优化。

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

    • using temporary:用到了临时表。

    • using filesort:将用外部排序而不是索引排序,数据量大,需要在磁盘完成排序,数据量小,在内存完成排序。

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

你可能感兴趣的:(数据库,数据库)