加快计算速率的 SQL 查询

Speeding up SQL query that compute rates

我必须计算合格率并保留总交付量,所有这些都是 SQL 中每个承运人(运输商)的。这是我为满足该需求而量身定制的查询,它成功地做到了,但是执行大约需要 5 分钟(知道 "LIVRAISON" table 有大约 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条件。) 我怎样才能将这种查询(顺便简化一下)加速到几秒钟?

查看您的代码,您可以在连接中使用 subselect 避免列值的 select,例如:

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 子句

我修改了 scaisEdge 答案(及时执行但给出的速率都等于 1)以使其可用:

SELECT TOURNEE.idTrans, nomTrans, ( t.tot_typeSt/COUNT(*) ) AS Taux,
COUNT(*) AS Total
FROM LIVRAISON NATURAL JOIN TOURNEE NATURAL JOIN TRANSPORTEUR
INNER JOIN ( SELECT TOURNEE.idTrans, COUNT(codeSt) AS tot_typeSt
    FROM LIVRAISON  NATURAL JOIN TOURNEE
WHERE {$typeStatut} AND DATE_SUB(SYSDATE(), INTERVAL 1 DAY)
GROUP BY TOURNEE.idTrans ) t ON t.idTrans = TOURNEE.idTrans WHERE DATE_SUB(SYSDATE(), INTERVAL 1 DAY)
GROUP BY idTrans

谢谢,我会记得使用 INNER JOIN 的。