我有来自3个不同表格的数据,我需要在它们之间进行一些条件选择。数据库查询如下:
SELECT proddb.onrrnr,
proddb.onr AS tellimus,
proddb.idnr AS ID,
proddb.prod AS toode,
proddb.proddate,
CASE
WHEN pf_prodQtySeq.glLiteNr = 1 THEN pf_ordRowSeq.gl1
WHEN pf_prodQtySeq.glLiteNr = 2 THEN pf_ordRowSeq.gl2
WHEN pf_prodQtySeq.glLiteNr = 3 THEN pf_ordRowSeq.gl3
WHEN pf_prodQtySeq.glLiteNr = 4 THEN pf_ordRowSeq.gl4
END AS klaas,
Sum(pf_prodQtySeq.planQty) AS kogus
FROM proddb
JOIN pf_prodQtySeq
ON proddb.onrrnr = pf_prodQtySeq.onrrnr
JOIN pf_ordRowSeq
ON proddb.onrrnr = pf_ordRowSeq.onrrnr
WHERE pf_prodQtySeq.prLineSh = 'HEG'
AND pf_prodQtySeq.planQty > 0
GROUP BY proddb.idnr
ORDER BY klaas DESC LIMIT 1000,25;
编辑:在代码中还有ORDER和LIMIT子句,LIMIT就是这样可以将查询执行速度降低到10秒,而LIMIT查询只需不到1秒。如何优化LIMITing?
此查询正常,但执行时间过长。此查询大约需要5秒,尽管每个表只包含少于50 000行。尝试速度提高了两倍,RAM服务器也增加了;也是同一时间。表被索引。 是否与查询有关,以加快它或我需要整合表。这意味着所有数据都将在一个表格中。
答案 0 :(得分:0)
看起来你的同一个表(pf_prodQtySeq
)上的每一列都有几个索引。
您应该做的是添加组合索引,以便where
- 子句的两个部分都可以从索引中受益。只有一个索引可用于表,因此您必须在同一索引中包含两个列才能获得更好的性能。
alter table pf_prodQtySeq add index prLineSh_planQty (prLineSh, planQty);
答案 1 :(得分:0)
您的查询执行情况良好。但建议排除使用filesort 和使用临时。 WHERE
子句包括对pf_prodQtySeq
表的引用。尝试强制优化器以第一顺序连接此表以减少MySQL额外传递次数(请参阅SELECT statement的STRAIGHT_JOIN
修饰符或table_references clause中的STRAIGHT_JOIN
)。为防止性能下降,请使用EXPLAIN
监控更改。有关详细信息,另请参阅Optimizing SELECT Statements。祝你好运!