【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 是明确左边表的数据肯定都有,从右边表进行查询数据 所以右边是关键,我们一定要加上索引