Explain详解与索引最佳实践

前面一章,我们学习了索引,了解了索引的底层数据结构。

那接下来,肯定是要来根据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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值