簡體   English   中英

使用DISTINCT優化​​mysql查詢供應商<->產品<->類別

[英]Optimize mysql query Suppliers <-> Products <-> Categories with DISTINCT

我的數據庫是這樣的:產品對類別是N:N,因此有一個聯接表(products_categories)。 產品有一個供應商(1個,只有1個),因此“產品”表中有一個Supplier_id。 產品約500,000,類別約200,供應商約80。

現在,我想獲得狀態為1且類別為2,3和125的“產品”的不同供應商。

我的SQL:

從供應商處選擇不同的s.id內聯products as p ON p.supplier_id = s.id內聯products_categories product_categories AS pc ON p.id = pc.products_id WHERE(p.color IN(“紅色”,“藍色”)) AND pc.categories_id IN(2,3,125)

查詢的問題是獨特的。 沒有它,查詢將在大約1秒鍾后返回,而DISTINCT則需要大約3秒鍾。 我有所有FK / PK的索引。

說明計划:

id  select_type table   type    possible_keys           key         key_len ref             rows    Extra
1   SIMPLE      pc      range   products_id,categories  categories  4       NULL            28335   Using where; Using temporary
1   SIMPLE      p       eq_ref  PRIMARY,color           PRIMARY     4       pc.products_id      1   Using where
1   SIMPLE      s       eq_ref  PRIMARY                 PRIMARY     4       p.supplier_id       1   Using where; Using index

添加非重復項將在解釋查詢計划中添加“使用臨時”。

那么,有什么方法可以優化此查詢? 如何更好地做到這一點(如有需要,還可以更改模式)

您是否嘗試過使用EXISTS

就像是

SELECT  s.id 
FROM    suppliers s 
WHERE   EXISTS  (
                    SELECT  1
                    FROM    products AS p INNER JOIN 
                            products_categories AS pc ON p.id = pc.products_id 
                    WHERE   (p.supplier_id = s.id)
                    AND     (p.color IN ('red', 'blue')) 
                    AND     pc.categories_id IN (2,3,125)
                )

嘗試GROUP BY而不是DISTINCT

SELECT s.id 
FROM suppliers s 
INNER JOIN products AS p ON p.supplier_id = s.id AND p.color IN ('red', 'blue')
INNER JOIN products_categories AS pc USE INDEX (combined_index_name) ON p.id = pc.products_id AND pc.categories_id IN (2,3,125)
GROUP BY s.id 

編輯

products_id表的products_categoriescategories_id列上創建一個合並索引。 然后檢查查詢的性能。

暫無
暫無

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

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