三表索引优化
1 | CREATE TABLE `phone` ( |
查看表中的索引
1 | mysql> SHOW INDEX FROM book; |
EXPLAIN
1 | mysql> EXPLAIN SELECT * FROM class INNER JOIN book ON class.card = book.card INNER JOIN phone ON book.card = phone.card; |
Extra:包含不适合在其他列中显示但十分重要的额外信息
Using filesort
Using temporary
Using index
Using where
Using join buffer:使用了连接缓存
impossible where
select tables optimized away +
distinct +
EXPLAIN
1 | mysql> EXPLAIN SELECT * FROM class LEFT JOIN book ON class.card = book.card LEFT JOIN phone ON book.card = phone.card; |
优化索引
1 | mysql> ALTER TABLE phone ADD INDEX Z (card); |
结论
1.最后2行的type 都是 ref 且 rows 优化很好,效果不错。因此索引最好设置在需要经常查询的字段中。
2.尽可能减少Join语句中的 NestedLoop 的循环总次数,永远用小结果集驱动大的结果集。
3.优先优化 NestedLoop 的内循环。
4.保证join 语句中被驱动的表上join 条件字段被索引。
5.当无法保证被驱动表的join条件字段被索引且内存资源充足的前提下,不要太吝啬JoinBuffer的设置。