前面一章,我们学习了索引,了解了索引的底层数据结构。
那接下来,肯定是要来根据mySql的存储,来对sql语句进行优化。
一谈到优化,我们最常见的就是用Explain来进行Sql分析
是什么
Explain
可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈。
在 select 语句之前增加 explain 关键字 ,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL。
参考官方文档:https://dev.mysql.com/doc/refman/8.0/en/explain-output.html
废话不多说,直接上实操,先建库表
DROP TABLE IF EXISTS `actor`;
# 只有主键索引
CREATE TABLE `actor`
(
`id` int(11) NOT NULL,
`name` varchar(45) DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8;
INSERT INTO `actor` (`id`, `name`, `update_time`)
VALUES (1, 'a', '2017-12-22 15:27:18'),
(2, 'b', '2017-12-22 15:27:18'),
(3, 'c', '2017-12-22 15:27:18');
DROP TABLE IF EXISTS `film`;
# 主键索引 + name字段索引
CREATE TABLE `film`
(
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(10) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_name` (`name`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8;
INSERT INTO `film` (`id`, `name`)
VALUES (3, 'film0'),
(1, 'film1'),
(2, 'film2');
DROP TABLE IF EXISTS `film_actor`;
# 主键索引 + film_id, actor_id联合索引
CREATE TABLE `film_actor`
(
`id` int(11) NOT NULL,
`film_id` int(11) NOT NULL,
`actor_id` int(11) NOT NULL,
`remark` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_film_actor_id` (`film_id`, `actor_id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8;
INSERT INTO `film_actor` (`id`, `film_id`, `actor_id`)
VALUES (1, 1, 1),
(2, 1, 2),
(3, 2, 1);
OK,我们来通过这三个表,来看看Explain的情况
直接看下面这位兄弟的文章吧。
https://blog.youkuaiyun.com/zza062400/article/details/136320654