首页 > 解决方案 > 加快计算速率的 SQL 查询

问题描述

我必须计算合格率并保持交付的总数,所有这些都是 SQL 中的每个承运人(运输商)。这是我为满足该需求而量身定制的查询,它成功地做到了,但执行大约需要 5 分钟(知道“LIVRAISON”表有大约 350.000 个条目):

SELECT idTrans AS id,
nomTrans,
(COUNT(codeSt)
    / (SELECT COUNT(*) 
       FROM LIVRAISON 
           NATURAL JOIN TOURNEE
       WHERE idTrans=id
           AND DateTrn = DATE_SUB(SYSDATE(), INTERVAL 1 DAY)
       )
) AS Taux,
(SELECT COUNT(*)
 FROM LIVRAISON
     NATURAL JOIN TOURNEE
 WHERE idTrans=id
     AND DateTrn = DATE_SUB(SYSDATE(), INTERVAL 1 DAY)
) AS Total 
FROM LIVRAISON
    NATURAL JOIN TOURNEE
    NATURAL JOIN TRANSPORTEUR
WHERE "{status_type}"
    AND DateTrn = DATE_SUB(SYSDATE(), INTERVAL 1 DAY)
GROUP BY idTrans

status_type是在 PHP 中添加的一个 IN 条件。)我怎样才能将这种查询(并顺便简化一下)加速到几秒钟?

标签: phpmysqlsqlperformancesimplify

解决方案


查看您的代码,您可以避免在连接中使用子选择来选择列值,例如:

select DISTINCT LIVRAISON.idTrans AS id
  , TRANSPORTEUR.nomTrans
  , t.my_rate
  , t.my_count
FROM LIVRAISON 
NATURAL JOIN TOURNEE
NATURAL JOIN TRANSPORTEUR
INNER JOIN  (
SELECT idTrans, COUNT(codeSt)/COUNT(*) my_rate,  COUNT(*) my_count
FROM LIVRAISON 
NATURAL JOIN TOURNEE
WHERE idTrans=id 
AND DateTrn = DATE_SUB(SYSDATE(), INTERVAL 1 DAY)
GROUP BY idTrans ) t ON t.idTrans = LIVRAISON.idTrans 
WHERE "{status_type}"
AND DateTrn = DATE_SUB(SYSDATE(), INTERVAL 1 DAY) 

可能是您也可以使用另一个内部连接来避免 IN 子句


推荐阅读