作者:IT王小二
一条查询 SQL 语句为什么会执行很慢?执行的时候走了什么索引?多表查询的时候 SQL 大体执行流程是怎么样的?Explain 执行计划详解给各位客官一一道来。
一、示例MySQL安装方式和版本
首先需要 MySQL 安装的客官看这两篇,小二演示使用的是 Docker 的安装方式:
小二安装完的 MySQL 数据库版本为 5.7.36
。
二、Explain工具简介
通常我们在生产环境会碰到查询速度比较慢的 SQL 语句,那么怎么知道 SQL 语句为什么执行慢呢?这个时候就需要用到 Explain 执行计划来分析我们的语句了。
通过使用 Explain 关键字可以模拟优化器执行 SQL 查询语句,执行会返回执行计划的信息,而不是执行这条SQL,当然如果 from 中包含子查询,仍会执行该子查询,将结果放入临时表中 。
总的来说,通过 Explain 从而知道 MySQL 是如何处理你的 SQL 语句的,分析查询语句或是表结构的性能瓶颈。那么通过 Explain 执行计划可以知道:
- 表的读取顺序
- 数据读取操作的操作类型
- 哪些索引可能被使用
- 哪些索引实际被使用
- 表之间的引用
- 每张表估计有多少行会被执行
三、本文用到的示例表
CREATE TABLE `author` (
`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 `author` (`id`, `name`, `update_time`) VALUES (1,'itwxe','2022-01-12 19:27:18'), (2,'admin','2022-01-12 19:27:18'), (3,'superAdmin','2022-01-12 19:27:18');
CREATE TABLE `blog` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(10) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_title` (`title`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `blog