explain执行计划详解,索引性能优化 mysql

2024-10-14 22:25 标签:explain mysql

一、explain简介

explain 关键字可以模拟优化器执行SQL语句,分析查询语句、结构的性能瓶颈,在 select 语句之前增加 explain 关键字,会获得执行计划的信息。

二、explain详解及性能调优

1、id 列

select 的序列号,id 值越大优先级越高,id 值相同从上往下执行,id为NULL最后执行

2、select_type 查询类型,可分为simple、primary、subquery、derived

(1)simple:简单查询,不包含子查询和 union;

(2)primary:复杂查询中最外层的 select;

(3)subquery:包含在 select 中的子查询,不在 from 子句中;

(4)derived:在 from 子句中的子查询,结果存放在一个派生临时表;

(5)union:在 union 中的第二个查询后的 select;

3、table列:访问的数据库表

(1)from 子句中有子查询时,table列是derivenN,其中N标识查询依赖 id=N 的查询;

(2)union 时,union result 的 table 列的值为union1,2,1和2表示参与 union 的 select 的 id 列;

4、partitions 列:基于分区表

partitions 字段显示查询访问的分区

5、type列:访问类型

(1)性能从高到低为:system > const > eq_ref > ref > range > index > ALL ;

(2)查询一般达到 range 级别较好,最好能达到 ref;

6、possible_keys列:可能使用到的索引

(1)explain 时可能出现 possible_keys 有列,而 key 显示 NULL 的情况,因为表中数据不多,mysql认为索引对查询帮助不大,选择了全表查询;

(2) 如果该列是NULL,则没有相关的索引,可以通过检查 where 创建一个适当的索引来提高查询性能;

7、key列:实际索引来优化对该表的访问

(1)没有使用索引,则该列是 NULL;

(2)强制mysql使用或忽视possible_keys列中的索引,在查询中使用 force index、ignore index;

8、key_len列

这一列显示了mysql在索引里使用的字节数;  

9、ref列

显示在key列记录的索引中,表查找值所用到的列或常量,常见的有:const(常量),字段名(例:test.id);

10. rows列

mysql估计要读取并检测的行数,不是结果集里的行数

11、filtered列

百分比值,rows * filtered/100 可以估算出将要和 explain 中前一个表进行连接的行数(前一个表指 explain 中的id值比当前表id值小的表);

12. Extra列:额外信息

(1)Using index:使用覆盖索引;

(2)Using where:使用 where 语句来处理结果,并且查询的列未被索引覆盖 ;

(3)Using index condition:查询的列不完全被索引覆盖,where 条件中是一个前导列的范围;

(4)Using temporary:mysql 需要创建一张临时表来处理查询,一般要进行索引优化; 

(5)Using filesort:将用外部排序而不是索引排序,数据较小时从内存排序,否则需要在磁盘完成排序,考虑使用索引来优化;

(6)Select tables optimized away:使用某些聚合函数(比如 max、min)来访问存在索引的某个字段;

最新技术文章
最新美图美景