如何对此进行优化?
SELECT e.attr_id, e.sku, a.value
FROM product_attr AS e, product_attr_text AS a
WHERE e.attr_id = a.attr_id
AND value
IN (
SELECT value
FROM product_attr_text
WHERE attribute_id = (
SELECT attribute_id
FROM eav_attr
WHERE attribute_code = 'similar_prod_id'
)
AND value != ''
GROUP BY value
HAVING (COUNT( value ) > 1 )
)发布于 2010-10-28 20:16:51
将其更改为联接。MySQL没有在IN()子句中优化子查询-它是按行重新计算的(对于许多行来说效率非常低)。
SELECT e.attr_id, e.sku, a.value
FROM product_attr AS e
INNER JOIN product_attr_text AS a ON e.attr_id = a.attr_id
INNER JOIN (SELECT value
FROM product_attr_text
INNER JOIN eav_attr ON eav_attr.attribute_id=product_attr_text.attribute_id
WHERE attribute_code = 'similar_prod_id'
AND value != ''
GROUP BY value
HAVING COUNT( value ) > 1
) AS filter ON filter.value=a.value在转换完查询之后(您可能需要根据您的模式进行一些更正),对查询和索引运行EXPLAIN。
发布于 2010-10-28 20:17:48
SELECT e.attr_id, e.sku, a.value
FROM (
SELECT pat.value
FROM eav_attr ea
JOIN product_attr_text pat
ON pat.attribute_id = ea.attribute_id
WHERE ea.attribute_code = 'similar_prod_id'
AND value <> ''
GROUP BY
value
HAVING COUNT(*) > 1
) q
JOIN product_attr_text AS a
ON a.value = q.value
JOIN product_attr AS e
ON e.attr_id = a.attr_id创建索引:
eav_attr (attribute_code)
product_attr_text (attribute_id, value)
product_attr_text (value)
product_attr (attr_id)发布于 2010-10-28 20:10:21
很难回答...
我唯一能说的就是:
看看声明中的哪一部分有问题,为什么。看看您是否可以通过添加索引等来提高性能。
除此之外,我不明白您为什么要使用group by子句...
还有,为什么使用子查询,而不是连接表?(尽管我认为这不会有太大的不同,因为SQL Server优化器应该足够智能,可以生成相同的执行计划)。
https://stackoverflow.com/questions/4042721
复制相似问题