MySQL聯合查詢和簡單查詢究竟如何選擇?
問題描述
最近看高性能MySQl,里面是推薦把聯合查詢分解為多個簡單的查詢,既然是這樣 那么還要聯合查詢干嘛?究竟是如何選擇才是效率更高的選擇呢?
問題解答
回答1:簡單的聯合查詢一般沒有必要分解,這里所說的應該是比較復雜的聯合查詢,譬如聯合查詢3,4張表,如果查詢較為復雜,涉及到分組,排序什么的,在運行時不能有效利用索引的。甚至有可能產生臨時表。那效率就會比較差。而且不利于查詢緩存。分解后針對每個簡單的查詢,數據庫有查詢緩存機制,會更加高效。對聯合查詢的語句盡量用explain分析一下有哪些問題?針對性的去改正。該分解的時候還是要分解。
回答2:select * from tb1left join tb2 on tb1.id=tb2.tidwhere tb1.stat=1 and tb2.stat=1 and tb1.type=1
select * from (select * from tb1 where stat=1 and type=1) as tb1left join tb2 on tb1.id=tb2.tidwhere tb2.stat=1
上面是一個簡單的案例, 其實我不是太明白你說的聯合查詢分解成多個簡單的查詢, 上面只能是我個人的一些優化(分解)方案而已(雖然也并不是每次都是這么用).
如果你所說的分解是將聯表拆成很多個語句, 然后在代碼中依次進行調用的話, 相信效率反而比聯表還低, 每次連接數據庫的 IO 開銷肯定比一次聯表來的多.
優化聯表查詢效率用一句話來說就是 用最少的正確數據進行關聯
最少的數據, 就可以通過, 在表進行關聯前, 提前將正確的數據提取出來, 避免關聯時還有很多明顯已經知道是錯誤的數據再去關聯.
無論是何種 join 方式, 這種方式都能適用.
更多的提高效率方案也還有很多像是 where 的順序, 字段類型, 索引 等等, 這個范圍就很大了.
回答3:只要用好索引,聯合查詢沒什么問題
相關文章:
1. idea 編譯的java文件 外面直接運行2. python中def定義的函數加括號和不加括號的區別?3. python - 有哪些預測算法可以根據實時增量數據更新算法并預測后續數據?4. (JAVA)最近在做到支付寶的一碼多付支付接口,發現沒有異步回調通知,需要自己輪詢查詢訂單狀態,這個需要怎么實現?5. 編程小白 問關于python當中類的方法的參數問題6. mysql - 分庫分表、分區、讀寫分離 這些都是用在什么場景下 ,會帶來哪些效率或者其他方面的好處7. pip安裝提示Twisted錯誤問題(Python3.6.4安裝Twisted錯誤)8. mysql - select查詢多個紀錄的條件怎么寫9. mysql - 求SQL語句:查詢某個值介于兩個字段值之間的記錄。10. html的qq快捷登錄怎么搞?求個源碼
