[英]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.