【MySQL优化】一分钟带你了解双表联查优化

如你不想自己测试案例,可直接看优化总结,了解知识点即可

创建表

CREATE TABLE IF NOT EXISTS `class` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`card` INT(10) UNSIGNED NOT NULL,
PRIMARY KEY (id)
);

CREATE TABLE IF NOT EXISTS `book` (
`bookid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`card` INT(10) UNSIGNED NOT NULL,
PRIMARY KEY (bookid)
)

模拟数据

INSERT INTO class(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO class(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO class(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO class(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO class(card) VALUES(FLOOR(1 + (RAND() * 20))); I
INSERT INTO class(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20)));

SQL需求

查询card相同的数据

select * from class left JOIN book on class.card=book.card;

分析语句: 可以看到type都是全表扫描 并且extra都是是从缓冲区

测试添加索引1

分析语句

    这是一个双表联查SQL 索引肯定需要添加在where条件的字段了 那么索引就加在card上 但是现在有一个问题我们是在左表的class上加还是右表的book呢!

开始大胆的测试,我们先加在左表class上

在进行一次explain,会发现并没与什么卵用

测试添加索引2

先删除刚刚添加的索引 在来进行分析 嗯 很完美

此次优化总结

    在进行双表联查时我们使用了left join 第一次在左边的表加了索引 但是没有效果 这是由左连接的特性决定的,left join 是明确左边表的数据肯定都有,从右边表进行查询数据 所以右边是关键,我们一定要加上索引
经验分享 程序员 微信小程序 职场和发展