首頁  >  問答  >  主體

MySQL联合查询和简单查询究竟如何选择?

最近看高性能MySQl,里面是推荐把联合查询分解为多个简单的查询,既然是这样 那么还要联合查询干嘛?究竟是如何选择才是效率更高的选择呢?

巴扎黑巴扎黑2743 天前720

全部回覆(3)我來回復

  • 迷茫

    迷茫2017-04-17 16:05:20

    簡單的聯合查詢一般沒有必要分解,這裡所說的應該是比較複雜的聯合查詢,譬如聯合查詢3,4張表,如果查詢較為複雜,涉及到分組,排序什麼的,在運行時不能有效利用索引的。甚至有可能產生臨時表。那效率就會比較差。而且不利於查詢快取。分解後針對每個簡單的查詢,資料庫有查詢快取機制,會更有效率。對共同查詢的語句盡量用explain分析一下有哪些問題?針對性的去改正。該分解的時候還是要分解。

    回覆
    0
  • 黄舟

    黄舟2017-04-17 16:05:20

    select * from tb1
    left join tb2 on tb1.id=tb2.tid
    where tb1.stat=1 and tb2.stat=1 and tb1.type=1
    select * from (
    select * from tb1 where stat=1 and type=1
    ) as tb1
    left join tb2 on tb1.id=tb2.tid
    where tb2.stat=1

    上面是一個簡單的案例, 其實我不是太明白你說的聯合查詢分解成多個簡單的查詢, 上面只能是我個人的一些優化(分解)方案而已(雖然也並不是每次都是這麼用).

    如果你所說的分解是將聯表拆成很多個語句, 然後在代碼中依次進行調用的話, 相信效率反而比聯表還低, 每次連接數據庫的IO 開銷肯定比一次聯表來的多.

    最佳化聯表查詢效率用一句話來說就是 用最少的正確資料進行關聯

    最少的數據, 就可以通過, 在表進行關聯前, 提前將正確的數據提取出來, 避免關聯時還有很多明顯已經知道是錯誤的數據再去關聯.

    無論是何種 join 方式, 這種方式都能適用.

    更多的提高效率方案也還有很多
    像是 where 的順序, 字段類型, 索引 等等, 這個範圍就很大了.

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 16:05:20

    只要用好索引,聯合查詢沒什麼問題

    回覆
    0
  • 取消回覆