开发者学堂课程【MySQL 高级应用 - 索引和锁:索引两表优化案例】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/598/detail/8609
索引两表优化案例
内容介绍
一、首次 explain 分析
二、第二次 explain 分析
三、第三次 explain 分析
一、首次 explain 分析
mysql> select * from class;
这个是和业务无关的主键,共计20个,card 分类卡,对图书进行分类。
Mysql> select * from book inner join class on book.card=class.card:
//主外键进行关联,如下图所示
下面开始 explain 分析,输入:
mysq1>EXPLAIN SELECT * FROM class LEFT JOIN book ON class.card=book. card;
//左表要全部查询
#结论:执行后发现 type 有 ALL,如下图:
#添加索引优化
ALTER TABLE
‘book’ADD INDEX Y (‘card’);
//建立一个索引
二、第二次 explain 分析
这时索引加入左表 class 好还是右表 book 好仍未知,所以两边都试一下,我们新建索引:
mysql> ALTER TABLE `book`ADD INDEX Y(`card`);
Query OK,0 rows affected(0. 02 sec)
Records: 0 Duplicates :0 Warnings:0
继续输入:
mysq1>EXPLAIN SELECT * FROM class LEFT JOIN book ON class.card=book. card;
结果如下:
此时左连接加到了右表上,可以看到第二行的 type 变成了 ref,rows 也好了很多,相比之前的双 ALL 优化明显,我们继续,此时将左连接加到左表上:
mysql> ALTER TABLE ` class `ADD INDEX Y(`card`);
Query OK,0 rows affected(0. 01 sec)
Records: 0 Duplicates :0 Warnings:0
同上继续输入:
mysq1>EXPLAIN SELECT * FROM class LEFT JOIN book ON class.card=book. card;
得到:
已明显看出表格并未显示出有很大的优化,这是由左连接特性决定的,LEFT JOIN条件用于确定如何从右表中搜索,此时左边一定全部都有,所以右边是关键,要建立索引。此时注意若不想删除索引,也可直接调换两表位置如:
mysq1>EXPLAIN SELECT * FROM book LEFT JOIN class ON class.card=book. card;
此时索引还在,但输出结果已变成左连接在左表时的样子。
三、第三次explain分析
现在来试试右连接的情况:
#优化较明显。这是因为 RIGT JOIN 条件用于确定如何从左表搜索行,右边一定都有,所以左边是我们的关键点一定要建立索引。
mysql> ALTER TABLE `class`ADD INDEX Y(`card`);
Query OK,0 rows affected(0. 05 sec)
Records: 0 Duplicates :0 Warnings:0
mysq1>EXPLAIN SELECT * FROM class RIGHT JOIN book ON class.card=book. card;
// class 和 book 没有对调位置,把左边换成了右边。请注意左边和右边没变,但是 right jion 改变了,右表 book 现在都有,现在索引还是要建在 book ,最终执行结果如下图:
现在我们重新建立一个表,代码如下
Mysql>ALTER TABLE class ADD INDEX Y(card);
Query ok, 0 rows affected (0,05 sec)
Records:0 duplicates:0 warnings:0
Mysql>explain select * from class right join book on class.card=book.card;
执行示例如下图所示:
此时右连接在左表上,结果是与左连接在右表相同,此时只要记住左表与右连接、右表与左连接,索引优化就完成了。