[英]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
asp
ON p.supplier_id = s.id內聯products_categories
product_categories ASpc
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_categories
和categories_id
列上創建一個合並索引。 然后檢查查詢的性能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.