我的数据库是这样的:产品是N:N到Categories,所以有一个连接表(products_categories)。产品有供应商(1和1),因此Products表有supplier_id。 产品约500K,类别约200和供应商约80。
现在我想获得状态= 1且类别为2,3和125的产品的Distinct供应商。
我的SQL:
SELECT DISTINCT s.id FROM供应商的INNER JOIN
products
ASp
ON p.supplier_id = s.id INNER JOINproducts_categories
ASpc
ON p.id = pc.products_id WHERE(p.color IN('red','blue'))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
添加distinct会在解释查询计划中添加“使用临时”。
那么,有没有办法优化这个查询?如何以更好的方式做到这一点(如果需要,也欢迎架构更改)
答案 0 :(得分:1)
您是否尝试使用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)
)
答案 1 :(得分:0)
尝试使用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
&上创建合并索引categories_id
表的products_categories
列。然后检查查询的性能。