php - 加快计算速率的 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 条件。)我怎样才能将这种查询(并顺便简化一下)加速到几秒钟?
解决方案
查看您的代码,您可以避免在连接中使用子选择来选择列值,例如:
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 子句
推荐阅读
- delphi - Win32 CreateDirectory 失败,路径中有多个文件夹
- c# - Linq 查询以返回具有多个子数组的对象列表
- sql - PL/SQL 中的触发器
- linux - 为什么增加网络缓冲区大小不能减少丢包?
- flutter - 如何在flutter中使用spotify sdk获取用户的关注者?
- html - 为什么我的网格布局有时会破坏悬停效果?
- python - TypeError: storage must be a werkzeug.FileStorage in Flask Upload
- rust - Rust:用于 Fn 成员签名的结构泛型类型参数需要命名生命周期
- typescript - TypeORM:无法读取未定义的属性“id”
- jquery - 仅当在确认框中单击“确定”时才更改日期选择器文本框值