gpt4 book ai didi

MySQL 优化复杂查询 NOT IN (2 SELECT WITH JOIN) WHERE

转载 作者:行者123 更新时间:2023-11-29 01:40:12 27 4
gpt4 key购买 nike

我有以下查询:

SELECT driver_id, first_name, last_name
FROM drivers
WHERE driver_id NOT IN
(SELECT DISTINCT w.driver_id from waybills w
JOIN drivers d ON d.driver_id = w.driver_id
WHERE w.waybill_owner = 1
AND w.waybill_status = 'dispatched'
AND w.delivery_date = '2014-10-28')
AND driver_id NOT IN
(SELECT DISTINCT wm.driver_id from waybill_movements wm
JOIN drivers d ON d.driver_id = wm.driver_id
WHERE wm.movement_owner = 1
AND wm.delivery_date = '2014-10-28')
AND status = 'active'
AND driver_owner = 1
ORDER BY last_name ASC

如何优化这个查询?

查询运行良好并返回预期结果,但我的问题是是否可以优化查询。

非常感谢您的时间和帮助。

更新:

而且,是的,我有这些索引:

运单(运单所有者、运单状态、w.delivery_date)waybill_movements (wm.movement_owner, delivery_date)drivers(driver_id 主键和 drivers(status, driver_owner)

表结构不需要优化

没想到会有这么多答案。谢谢大家。

最佳答案

这取决于的定义是什么。您可能希望将那些 WHERE IN 子查询重写到您的 FROM 子句中,然后针对它运行现有查询,头对头,看看 MySQL explain 是否给出了不同的执行路径和统计数据。

毫无疑问,因为您几乎必须在现有查询中三次访问 drivers 表才能获得所需的结果。这完全是不必要的开销。

SELECT d.driver_id, d.first_name, d.last_name
FROM drivers d
LEFT OUTER JOIN waybills w ON
d.driver_id = w.driver_id AND
w.waybill_owner = 1 AND
w.waybill_status = 'dispatched' AND
w.delivery_date = '2014-10-28'
LEFT OUTER JOIN waybill_movements wm ON
d.driver_id = wm.driver_id AND
wm.movement_owner = 1 AND
wm.delivery_date = '2014-10-28')
WHERE
w.driver_id IS NULL AND
wm.driver_id IS NULL AND
d.status = 'active' AND
d.driver_owner = 1
ORDER BY last_name ASC

您的 ORDER BY 也很昂贵,一如既往。如果不需要,那么删除它可能是个好主意。

您可能想通过解释运行@StuartLC 建议的 SQL 和这个,看看 MySQL 更喜欢其中任何一个。你可能会用他的方法找到更好的结果,但有时这是掷硬币。 MySQL 对派生表的处理速度通常不是特别快,因此尽可能多地使用传统连接可以产生更好的结果。但这完全取决于表的大小,它们是否有适当的索引和所有有趣的东西。

关于MySQL 优化复杂查询 NOT IN (2 SELECT WITH JOIN) WHERE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26609449/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com