MySQL高级篇之多表索引优化实战

多表优化

上一篇写了单表优化,那么这篇就来说一下多表优化
1建立三张表
菜单表Category,二级菜单表CategorySecond和商品表product

首先分析两张表的查询

例子:查询一级菜单下的所有二级菜单
select * from category cate
left join categorysecond cse on cate.cid=cse.cid
执行sql成功,分析这条SQL
在这里插入图片描述
为这个字段建立索引:
1,在category中建立索引
create index ind_cid on category(cid)在这里插入图片描述
可以发现:
虽然我们建立了索引,但是这个sql并么有用到我们所建立的索引,是因为什么呢?
我接着往下看
2,在categorySecond中建立索引

create index ind_cid on categorysecond(cid)
在这里插入图片描述
可以看到,在右表categorysecond中建立索引之后,就用到了索引
性能也得到了提高:
type由all变成了ref,rows由36变成了4
思考一下,得出结论:
在进行多表关联查询的时候,左表相当于数据源,而右表相当于目标表,左表任何时候,都一定会全部加载,而右表只会加载符合条件的记录行,所以即使我们将索引建立到了左表,也不会生效!!!
接下来再继续看看三表的情况吧!

例子查询菜单中的所有商品
select * from category cate
left join categorysecond cas on cate.cid=cas.cid
left join product pro on pro.csid=cas.csid
分析这条SQL在这里插入图片描述
上图所示:未建立索引,其type为all,rows中显示了对应表的所有行,即全表扫描

根据两张表的优化结论,直接给右表categorysecond中的cid和product中的csid建立索引
create index ind_cid on categorysecond(cid);
create index ind_csid on product(csid)
再次分析这条sql
在这里插入图片描述
可以看到该sql使用了我们建立的两个索引
type类型由all变成了ref类型,rows预查询行也大大减少
总结:
在进行多表关联查询时,在被关联表上建立索引,可以使用到索引字段。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章