一. 预备知识
阅读本文章前需要掌握MySQL索引的底层数据结构相关知识,可以查看我之前的文章深入理解MySQL索引底层数据结构与算法。
索引前导列
: 所谓前导列,就是联合索引的第一列或者从第一列开始连续多列的组合。比如通过语句CREATE INDEX table1_index ON table1 (x, y, z)
创建索引,那么x、xy、xyz都是前导列,而yz,y,z这样的就不是。覆盖索引
: 覆盖索引是select的数据列只用从索引中就能够取得,不必读取数据表,换句话说查询列要被所建的索引覆盖。
二. explain命令的作用
- 使用
explain
关键字可以模拟优化器执行SQL语句,知道MySQL是如何处理你的SQL语句的,从而分析你的查询语句的性能瓶颈。 - 在
select
语句前添加explain
关键字,MySQL会在查询上设置一个标记,在执行查询时,会返回执行计划信息,而不是返回查询语句的执行结果;如果from子句中包含select语句,该子查询依然会被执行,并且子查询的结果会产生临时表。
三. explain讲解
需要使用的表
- Actor演员表
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');
- film影片表
DROP TABLE
IF EXISTS `film`;
CREATE TABLE `film` (
`id` INT (11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR (10) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_name` (`name`)