优化mysql查询供应商< - >产品< - >带有DISTINCT的类别

时间:2014-01-27 05:53:28

标签: mysql sql select join query-optimization

我的数据库是这样的:产品是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 AS p ON   p.supplier_id = s.id INNER JOIN products_categories AS pc 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会在解释查询计划中添加“使用临时”。

那么,有没有办法优化这个查询?如何以更好的方式做到这一点(如果需要,也欢迎架构更改)

2 个答案:

答案 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列。然后检查查询的性能。