簡體   English   中英

使用多個聯接條件優化SQL查詢

[英]Optimize SQL query with multiple join condition

我有兩個像下面這樣的mysql表:

table_category
-----------------
id | name | type    
1  | A    | Cloth     
2  | B    | Fashion    
3  | C    | Electronics    
4  | D    | Electronics

table_product
------------------
id | cat_cloth | cat_fashion | cat_electronics    
1  | 1         | 2           | 3    
1  | NULL      | 2           | 4

這里cat_cloth, cat_fashion, cat_electronics是來自table_category ID

最好有另一個表用於類別類型,但是我現在需要一個快速的解決方案。

我想獲取具有產品總數的類別列表。 我寫了以下查詢:

SELECT table_category.*, table_product.id, COUNT(table_product.id) as count
FROM table_category
LEFT JOIN table_product` ON table_category.id = table_product.cat_cloth 
    OR table_category.id = table_product.cat_fashion 
    OR table_category.id = table_product.cat_electronis
GROUP BY table_product.id
ORDER BY table_product.id ASC

問題:我編寫的SQL可以工作,但是我有14K類別和50K多種產品,並且SQL的運行速度非常慢。 我為cat_ * ids添加了索引,但是沒有任何改善。 我的問題是如何優化此查詢?

我發現查詢需要3-4分鍾來處理我提到的數據量。 我想減少執行時間。

最好的祝福

據我所知,“ ON”或“ WHERE”部分中的每個“ OR”都非常昂貴。 這聽起來很愚蠢,但我建議您將3個單獨的小選擇與UNION ALL結合使用。 我們在mysql和postgresql中都遇到了類似的問題,在某些情況下,當“資源超出”時,我們也必須對bigquery做同樣的事情。 因此,這是非常愚蠢的,您將需要做更多的工作,但它當然可以工作,並且比許多“或”運算要快得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM