前言:
explain通常用于查看一个这些SQL语句的执行计划,查看该SQL语句有没有使用上了索引,有没有做全表扫描,让我们能清楚的分析sql是否需要进行优化
使用方法:
再查询语句的前面加上 EXPLAIN就OK啦!例如:
-
id: SELECT 查询的标识符. 每个 SELECT 都会自动分配一个唯一的标识符.
(1) id相同时,执行顺序由上至下
(2) 如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行
(3)id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行
-
select_type: SELECT 查询的类型
(1) SIMPLE(简单SELECT,不使用UNION或子查询等)
(2) PRIMARY(查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY)
(3) UNION(UNION中的第二个或后面的SELECT语句)
(4) DEPENDENT UNION(UNION中的第二个或后面的SELECT语句,取决于外面的查询)
(5) UNION RESULT(UNION的结果)
(6) SUBQUERY(子查询中的第一个SELECT)
(7) DEPENDENT SUBQUERY(子查询中的第一个SELECT,取决于外面的查询)
(8) DERIVED(派生表的SELECT, FROM子句的子查询)
(9) UNCACHEABLE SUBQUERY(一个子查询的结果不能被缓存,必须重新评估外链接的第一行)
-
table: 查询的是哪个表
-
partitions: 匹配的分区
-
type: join 类型
常用的类型有: ALL, index, range, ref, eq_ref, const, system, NULL(从左到右,性能从差到好)
(1) ALL:进行了全表扫描。
(2) index: 全索引扫描。
(3) range:有范围的索引扫描。相对于index的全索引扫描,它有范围限制,因此要优于index。关于range比较容易理解,需要记住的是出现了range,则一定是基于索引的。同时除了显而易见的between,and以及'>','<'外,in和or也是索引范围扫描。
(4) ref: 查找条件列使用了索引而且不为主键和unique。其实,意思就是虽然使用了索引,但该索引列的值并不唯一,有重复. 这样即使使用索引快速查找到了第一条数据,仍然不能停止,要进行目标值附近的小范围扫描。
(5) eq_ref: 类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者 unique key作为关联条件
(6) const、system: 当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量,system是const类型的特例,当查询的表只有一行的情况下,使用system
(7) NULL: MySQL在优化过程中分解语句,执行时甚至不用访问表或索引
-
possible_keys: MySQL能使用哪个索引在该表中找到行
-
key: 此次查询中确切使用到的索引.
-
ref: 显示使用哪个列或常数与key一起从表中选择行。
-
rows: 显示此查询一共扫描了多少行. 这个是一个估计值.
-
extra: 额外的信息
相关文章:mysql的优化技巧、mysql查询慢日志与相关运用!