Explain是mysql提供的针对查询语句模拟优化的工具,可以针对输出的结果进行有效分析。
mysql8.0Explian官网地址
https://dev.mysql.com/doc/refman/8.0/en/explain-output.html
建几张表备用
CREATE TABLE `actor` ( `id` int NOT NULL, `name` varchar(45) DEFAULT NULL, `update_time` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; CREATE TABLE `film` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(10) DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_name` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; CREATE TABLE `film_actor` ( `id` int NOT NULL, `film_id` int NOT NULL, `actor_id` int NOT NULL, `remark` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_film_actor_id` (`film_id`,`actor_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
随便执行一行查询语句,发现结果集中出现多列语义。id、select_type、table、type列等等。那其中各列的含义是什么?
id列的编号是select序列号,id顺序是根据select出现的顺序排序的。
select (select * from actor where id = 1) from (select * from xxx where x) der;
表示当前explain行正在查询的表。
type列是Explain中最为关键的列。
查询性能排序依次是:
system > const > eq_ref > ref > range > index > ALL
EXPLAIN SELECT * FROM film WHERE NAME='a';
EXPLAIN SELECT * FROM actor WHERE id>1;
-----------------------------------------------------------------------------以下为不及格的使用----------------------------------------------------------------------------
index:全表扫描整个二级索引的叶子节点(下述场景中,film表中所有字段均被索引或主键覆盖,此时会出现覆盖索引查询)
EXPLAIN SELECT * FROM film;
All:全表扫描聚集索引的叶子节点(actor表中的所有数据都要查到,包括非索引字段,此时最优的查询方案就是聚簇索引的全表扫描)
EXPLAIN SELECT * FROM actor;