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預查詢行也大大減少
總結:
在進行多表關聯查詢時,在被關聯表上建立索引,可以使用到索引字段。

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