我的SQL查询这么慢是正常的吗?

时间:2013-01-16 18:27:07

标签: mysql sql performance

我遇到系统过载的问题。 下面的查询是从3个表中获取数据,其中2个表有超过10.000个记录,运行需要50秒。

SELECT DISTINCT
p.prod_name,
p.prod_price,
Sum(dt.vt_qtd) as total_qtd

FROM tdb_products p 
LEFT JOIN tdb_sales_temp dt ON p.prod_mp_id = dt.vt_product
LEFT JOIN tdb_sales s ON dt.vt_cupom = s.sl_coupom

WHERE
s.sl_day = $day_link AND
s.sl_mon = $mon_link AND
s.sl_year = $year_link

GROUP BY
p.prod_name

ORDER BY
p.prod_name ASC

这是正常的吗?

解决!

2 个答案:

答案 0 :(得分:10)

SELECT  prod_name, prod_price, SUM(dt.vt_qtd) AS total_qtd
FROM    tdb_sales s
JOIN    tdb_sales_temp dt
ON      dt.vt_cupom = s.sl_coupom
JOIN    tdb_products p
ON      p.prod_mp_id = dt.vt_product
WHERE   (s.sl_day, s.sl_mon, s_sl_year) = ($day_link, $mon_link, $year_link)
GROUP BY
        p.prod_name -- but it's better to group by product's PRIMARY KEY

删除DISTINCT(这是GROUP BY的冗余,然后选择分组字段)

LEFT JOIN重写为INNER JOIN,因为您在LEFT JOIN'ed表上有过滤条件。

创建索引:

tdb_sales (sl_year, sl_mon, sl_day, sl_coupom)
tdb_sales_temp (vt_cupom, vt_product)
tdp_product (prod_mp_id) -- it's probably a PRIMARY KEY and you already have it

答案 1 :(得分:4)

简短的回答是否定的,这绝对不是一个好的时间长度。任何通用数据库系统都应该能够以亚秒级时间处理多个10,000行表。

不知道完整架构或dbms后端,我的建议是:

索引 - 确保连接中使用的列具有适当的索引 数据类型 - 如果要连接的列上的数据类型存在差异,则dbms必须为每个行连接执行转换,这可能会导致显着的性能消耗。