看懂MySql执行计划explain

2022-12-17  本文已影响0人  舞鹤Roc

SQL执行计划

处理慢SQL就要分析SQL,不可或缺的我们需要使用mysql的explain命令查询SQL执行计划,这就需要看懂执行计划中每个返回的含义,从而定位原因并优化SQL。

首先,新建一张用户表:

CREATE TABLE `user`
(
    `id`          int(11)     NOT NULL AUTO_INCREMENT,
    `name`        varchar(24) NOT NULL DEFAULT '' COMMENT '姓名',
    `age`         int(11)     NOT NULL DEFAULT '0' COMMENT '年龄',
    `create_time` timestamp   NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    PRIMARY KEY (`id`),
    KEY `idx_name_age` (`name`, `age`) USING BTREE
) ENGINE = InnoDB
  AUTO_INCREMENT = 1
  DEFAULT CHARSET = utf8 COMMENT ='用户表';

并使用存储过程插入1万条数据:

drop procedure if exists gen_user;
delimiter ;;
create procedure gen_user()
begin
    declare i int;
    set i = 1;
    while(i <= 10000)
        do
            insert into user(name, age) values (CONCAT('test', i), i);
            set i = i + 1;
        end while;
end;;
delimiter ;
call gen_user();

我们执行几段普通SQL,来看一下执行计划返回了12列(MySql5.7):

explain SELECT * FROM user WHERE name = 'test666';
test1
EXPLAIN SELECT * FROM user WHERE (name = 'test1' or name = 'test2') AND age = 2;
test2
EXPLAIN SELECT name,count(*) FROM user WHERE  age > 666 group by name
test3

我们下面对这些字段出现的可能进行解释:

一、 id

SQL执行的顺序的标识,SQL从大到小的执行

二、select_type

示查询中每个select子句的类型

三、table

显示这一行的数据是关于哪张表的

四、partitions

当前查询匹配记录的分区

五、type

表示MySql在表中找到所需行的方式,又称“访问类型”。
常用的类型有: ALL, index, range, ref, eq_ref, const, system, NULL(从左到右,性能从差到好)

六、possible_keys

指出MySql能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用

七、Key

key列显示MySql实际决定使用的键(索引)

八、key_len

表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度

九、ref

表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值

十、rows

表示MySql根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数

十一、filtered

表示符合查询条件的数据百分比,最大100

十二、Extra

该列包含MySql解决查询的详细信息,有以下几种情况:

总结

上一篇下一篇

猜你喜欢

热点阅读