在日常开发中我们经常会碰到查询时间特别长的SQL语句(俗称慢SQL),为了提高系统的查询效率,我们需要对这些慢SQL进行优化总而提高用户的体验度。这个时候就要用到explain了,通过explain可以排查出该SQL的扫描范围,是全表扫描还是通过索引来查询。explain的使用如下所示:
日常开发中查询语句
select * from tb_user where username = '杨尼玛';
explain语句
explain select * from tb_user where username = '杨尼玛';
explain sql语句之后出来11列信息,如下图所示:
接着我们对上述的信息进行信息分析:
1 、id:选择标识符;
2、select_type:查询的类型,上图的查询类型为simple;
3、table:你查询的表,如上述sql语句中的tb_user表;
4、type:查询的类型,如全表查询、通过索引查询等;
5、possible_keys:查询时可能用到的索引;
6、key:查询时用到的索引;
7、key_len:索引字段的长度;
8、ref:ref:列与索引的比较;
9、rows:sql查询的记录(估算的行数);
10、filtered:按表条件过滤的行百分比;
11、Extra:执行情况的描述和说明;
12、partitions:匹配的分区
常用项解释
一:type:表示查询的类型,常见的类型有:ALL、index、range、 ref、eq_ref、const、system、NULL(从左到右,性能从差到好)。
ALL:代表全表扫描;
index:表示该查询通过索引扫描;
range:只在给定的范围为检索或者扫描记录;
ref: 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值
eq_ref::类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者 unique key作为关联条件;
const、system::当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量,system是const类型的特例,当查询的表只有一行的情况下,使用system;
NULL: MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成;
二:possible_key表示查询时可以使用那些索引在表中查找数据,但是该索引在实际查询中可能不使用。
三:key表示查询时实际用到的索引,该索引必须被possible_key包含。