我遇到系统过载的问题。 下面的查询是从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
这是正常的吗?
解决!
答案 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必须为每个行连接执行转换,这可能会导致显着的性能消耗。