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