2017-05-03 80 views
0

我有数据来自3个不同的表快到了,我需要做它们之间的一些条件选择。 DB查询如下:MySQL的多表连接

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秒,而不会限制查询需要大约小于1秒。如何优化LIMITing?

这个查询工作确定,但它需要太多的时间来执行。此查询大约需要5秒,但每个表只包含少于50 000行。试了两次更快,并有更多的RAM服务器;也是同样的时间。表格被索引。 是否有与查询加快或我需要巩固表。这意味着所有的数据将在一个表中。

EXPLAIN结果: enter image description here

+1

'这个查询的工作OK' ...不是真的,因为你在使用'集团BY'选择非聚合列。也许添加一个关于查询应该做什么的描述。 –

+0

您可以尝试使用'inner join',而不是'join'。 –

+0

使用'EXPLAIN'来检测查询性能改进的方式。你也可以在你的问题中显示'EXPLAIN'结果。 – Alexander

回答

0

它看起来像你有几个每对同一表(pf_prodQtySeq)一列索引。

你应该做的是增加一个组合索引,以便您的where -clause的两个部分可以从索引中受益。只有一个索引可以用于表,因此您必须将两个列放在同一个索引中才能获得更好的性能。

alter table pf_prodQtySeq add index prLineSh_planQty (prLineSh, planQty); 
0

您的查询执行情况良好。但使用的filesort使用临时建议排除。 WHERE子句包含引用pf_prodQtySeq表。尝试强制优化加入这个表中的第一个,以减少额外的MySQL经过数(见STRAIGHT_JOIN修改为table_references clauseSELECT statementSTRAIGHT_JOIN)。为了防止性能降低,请使用EXPLAIN监视更改。有关更多信息,另请参阅Optimizing SELECT Statements。祝你好运!