繁体   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