作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下查询:
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/
我是一名优秀的程序员,十分优秀!