当在项目中遇到慢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
网友评论