从explain讲解Mysql 如何使用索引

   当在项目中遇到慢sql的时候时常会想到mysql中的explain命令,今天就详细讲解一下该命令的使用。
2.png

3.png

很简单的命令,通过explain命令展示相关参数

1. Id

    select查询序号列号,即为sql语句执行的顺序。id越大优先级越高,优先执行。

2. select_type

2.1  SIMPLE    简单select查询
 2.2  PRIMARY  有子查询,最外层select查询
 2.3  UNION    union语句的第二个或者说是后面那一个.不依赖外部查询
 2.4  DEPENDENT UNION  union语句的第二个或者说是后面那一个依赖外部查询
 2.4  SUBQUERY  子查询中的第一个select查询,不依赖于外 部查询的结果集
 2.5  DEPENDENT SUBQUERY  子查询中的第一个 select 查询,依赖于外部 查询的结果集
 2.6  DERIVED   from子句里有子查询的情况。 MySQL 会 递归执行这些子查询, 把结果放在临时表里

3. table

  输出所引用的表

4. type

 显示连接使用的类型,按照最优到最差类型排序
 4.1   system  表仅有一行(=系统表)。这是 const 连接类型的一个特例。
 4.2   const        const 用于用常数值比较 PRIMARY KEY 时。当查询的表仅有一行时,使用 System。
 4.3   eq_ref  用于使用= 操作符比较的带索引的列。比较值可以为常量或一个使用在该表前面所读取的表的列的表达式
 4.4   ref     连接不能基于关键字选择单个行,可能查找到多个符合条件的行。叫做 ref 是因为索引要跟某个参考值相比较。 
 4.5   ref_or_null    如同 ref, 但是 MySQL 必须在初次查找的结果里找出 null值的行,然后进行二次查找。
 4.6   index_merge     索引合并优化被使用了。
 4.7   unique_subquery  在某些 IN 查询中使用此种类型,而不是常规的 ref:value IN (SELECT primary_key FROM single_table WHERE some_expr)
 4.8   index_subquery        在 某 些 IN 查 询 中 使 用 此 种 类 型 , 与 unique_subquery 类似,但是查询的是非唯一 性索引: value IN (SELECT key_column FROM single_table WHERE some_expr)
 4.9   range   只检索给定范围的行,使用一个索引来选择 行。key 列显示使用了哪个索引。当使用=、 <>、>、>=、<、<=、IS NULL、<=>、BETWEEN 或者 IN 操作符,用常量比较关键字列时,可 以使用 range。
 4.10  index        全表扫描,只是扫描表的时候按照索引次序 进行而不是行。主要优点就是避免了排序, 但是开销仍然非常大。
 4.11  all      最坏的情况,从头到尾全表扫描。

5. possible_keys

 指的是有哪些索引有助于查询,为空说明不存在索引

6. key

  mysql使用的索引

7. ref

  显示那列被使用

8. rows

  检查后用于返回请求数据行数

9. Extra

 包含了Mysql解决查询的详细信息
   9.1  Distinct  一旦MYSQL找到了与行相联合匹配的行就不搜索
   9.2  Using index  说明使用了索引
   9.3  Using where 使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户extra  MySQL 会对结果使用一个外部索引排序,而不是从表里按索引次序读到相关内容。可能在内存或者磁盘上进行排序,成为文件排序
   9.4 Using filesort 需要优化 Mysql进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来排序全部行 
   9.5 Using temporary 需要优化 MySQL 在对查询结果排序时使用临时表。常见于排序 order by 和分组查询 group by
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容