mysql - 如何在 where 子句中优化带有 OR 的计数行的 sql 查询?
问题描述
我编写了一个 SQL 查询来计算行数。我在 WHERE 子句中使用 IN 和 OR。当前查询需要很长时间(大约 10 秒)才能执行。请帮我优化 SQL 查询。我正在分享我的代码:
COUNT(*)
FROM
booking_status_journey bs
INNER JOIN booking_indonesia b ON b.id = bs.booking
WHERE
bs.hid IN (
4,
5,
6,
7,
11,
14,
16,
17,
18,
19,
23,
24,
25,
26
)
AND (
(
UNIX_TIMESTAMP(STR_TO_DATE(bs.picked_up_fromwh, '%d/%m/%Y')) <= UNIX_TIMESTAMP('2020-10-15')
AND UNIX_TIMESTAMP(STR_TO_DATE(bs.picked_up_fromwh, '%d/%m/%Y')) >= UNIX_TIMESTAMP(DATE_SUB('2020-10-15', INTERVAL 5 DAY))
AND b.no_show_count = 0
AND bs.rabbit_id1 IS NOT NULL
AND bs.parcel_picked1 IS NULL
AND bs.start_delivery1 IS NULL
AND bs.arrived_at_drop_off1 IS NULL
AND bs.delivered IS NULL
)
OR (
UNIX_TIMESTAMP(STR_TO_DATE(bs.picked_up_fromwh, '%d/%m/%Y')) <= UNIX_TIMESTAMP('2020-10-15')
AND UNIX_TIMESTAMP(STR_TO_DATE(bs.picked_up_fromwh, '%d/%m/%Y')) >= UNIX_TIMESTAMP(DATE_SUB('2020-10-15', INTERVAL 5 DAY))
AND b.no_show_count = 1
AND bs.rabbit_id2 IS NOT NULL
AND bs.parcel_picked2 IS NULL
AND bs.no_show1 IS NOT NULL
AND bs.start_delivery2 IS NULL
AND bs.arrived_at_drop_off2 IS NULL
AND bs.delivered IS NULL
AND bs.failed IS NULL
AND bs.returned_after_failed IS NULL
AND bs.returned_after_no_show1 IS NULL
AND bs.returned_towh IS NULL
)
)```
[1]: https://i.stack.imgur.com/mPDTG.png
解决方案
推荐阅读
- php - PHP HTTP Guzzle 客户端 - 如何使用 Guzzle Streams 解析 JSON 数组
- android - Android react-native中的https连接在构建后无法在物理设备上运行
- spring - 我可以在 spring servlet 过滤器中使用 RequestHeader 注释吗?
- java - Java:为什么堆溢出不会触发堆转储?
- jquery - 为什么表体中没有数据?
- linux - 无法用 sed 命令替换文件内容
- android - 如何在颤振中打开这种类型的警报对话框
- sqlite - SQLite 将单行转换为多行
- c# - 用于发布/订阅的 ASP.NET Core 动态端口
- html - Jquery contextmenu 事件在 ios/Safari 上不起作用,而是长按打开默认的复制粘贴菜单