MySQL多表连接

时间:2017-05-03 11:50:28

标签: mysql

我有来自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服务器也增加了;也是同一时间。表被索引。 是否与查询有关,以加快它或我需要整合表。这意味着所有数据都将在一个表格中。

EXPLAIN结果: enter image description here

2 个答案:

答案 0 :(得分:0)

看起来你的同一个表(pf_prodQtySeq)上的每一列都有几个索引。

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

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

答案 1 :(得分:0)

您的查询执行情况良好。但建议排除使用filesort 使用临时WHERE子句包括对pf_prodQtySeq表的引用。尝试强制优化器以第一顺序连接此表以减少MySQL额外传递次数(请参阅SELECT statementSTRAIGHT_JOIN修饰符或table_references clause中的STRAIGHT_JOIN)。为防止性能下降,请使用EXPLAIN监控更改。有关详细信息,另请参阅Optimizing SELECT Statements。祝你好运!