开发者学堂课程【MySQL 高级应用 - 索引和锁:索引三表优化案例】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/598/detail/8610
索引三表优化案例
内容介绍
一、三表索引优化
二、Join 语句的优化
一、三表索引优化
首先我们再加入一个表 phone:
CREATE TABLE IF NOT EXISTS `phone` (
`phoneid`lNT (10) UNSIGNED NOT NULL AUTO _lNCREMENT,
`card`INT(10) UNSIGNED NOT NULL ,
PRIMARYKEY (`phoneid`)
)ENGINE=INNODB;
CREATETABLEIFNOTEXISTS `phone’(
`phoneid`lNT(10) UNSIGNEDNOTNULLAUTO _lNCREMENT,
`card`INT(10) UNSIGNEDNOTNULL ,
PRIMARYKEY (`phoneid`)
)ENGINE=INNODB;
INSERT INTO phone (card)VALUES(FLOOR(1+(RAND()*20)));
INSERT INTO phone (card)VALUES(FLOOR(1+(RAND()*20)));
INSERT INTO phone(card)VALUES(FLOOR(1+(RAND()*20)));
INSERT INTO phone (card)VALUES(FLOOR(1+(RAND()*20)));
INSERT INTO phone(card)VALUES(FLOOR(1+(RAND()*20)));
INSERT INTO phone (card)VALUES(FLOOR(1+(RAND()*20)));
INSERT INTO phone(card)VALUES(FLOOR(1+(RAND0*20)));
INSERT INTO phone (card)VALUES(FLOOR(1+(RAND()*20)));
贴进后输入:
mysql>select*from phone;
就得到第三张表 phone,
我们将多建的表删掉:
mysql>drop index Y on class;
若没有多余表就跳过,此时应有 class、book、phone 三张表,此时我们没有建立连接,执行三表:
mysq1>explain SELECT*FROM class inner JOIN book ON class.
card=book. card inner JOIN phone ON book. card=phone. card;
此时得到下图:
这时出现了 using join buffer,因为此时表增多,MySQL 提升了性能使用了连接缓存。
接下来我们 EXPLAIN:
mysq1> EXPLAIN SELECT*FROM class LEFT JOIN book ON class.
card=book. card LEFT JOIN phone ON book. card=phone. card;
结果如下图:
此时并未优化,所以都是 all。
我们继续开始优化,加入索引:
mysql>ALTER TABLE `phone`ADDINDEX z (`card`);
Query OK,0 rows affected(0. 02 sec)
Records: 0 Duplicates :0 Warnings:0
mysql>ALTER TABLE `phone`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 LEFT JOIN phone ON book. card=phone. card;
此时结果如下:
这时后2行的 type 都是 ref 且总 rows 优化很好,因此要把索引设置在需要经常查询的字段中。
二、Join 语句的优化
1、尽可能减少 Join 语句中的 NestedLoop 的循环总次数;“永远用小结果集驱动大的结果集”。如书是可以无限多的,但是书的种类是少的,要用书的种类去划分书。
2、优先优化 NestedLoop 的内层循环。
3、保证 Join 语句中的被驱动表上 join 条件字段已被索引。
当无法保证被驱动的 join 条件字段被索引且内存资源充足的前提下,不要吝啬 joinBuffer 的设置。