以下是一个存储过程中的SQL语句(为了简洁而省略部分内容):
SELECT *
FROM item a
WHERE a.orderId NOT IN (SELECT orderId FROM table_excluded_item);
这个语句需要大约30秒钟的时间!但如果我删除内部的SELECT查询,它会降到1秒。 table_excluded_item
不是很大,但我怀疑内部查询被执行了比必要更多的次数。
有没有更有效率的方法来做这件事?
以下是一个存储过程中的SQL语句(为了简洁而省略部分内容):
SELECT *
FROM item a
WHERE a.orderId NOT IN (SELECT orderId FROM table_excluded_item);
这个语句需要大约30秒钟的时间!但如果我删除内部的SELECT查询,它会降到1秒。 table_excluded_item
不是很大,但我怀疑内部查询被执行了比必要更多的次数。
有没有更有效率的方法来做这件事?
使用LEFT JOIN
SELECT a.*
FROM item a
LEFT JOIN table_excluded_item b
ON a.orderId = b.orderId
WHERE b.orderId IS NULL
确保两个表中的orderId
都已经被索引。
left outer join
,即使存在重复项。尽管如此,我仍然持怀疑态度,认为这种优化并不总是发生。IN
语句。最好的解决方法是相关子查询:SELECT *
FROM item a
WHERE not exists (select 1
from table_excluded_item tei
where tei.orderid = a.orderid
limit 1
)
limit 1
对此可能不是严格必要的)。这是在 MySQL 中实现您想要的最快和最安全的方法。试一下这个,然后与 LEFT JOIN
查询时间进行比较:
SELECT *
FROM item a
HAVING orderId NOT IN (SELECT orderId FROM table_excluded_item);
在 IT 相关领域,使用 HAVING
而不是 WHERE
是被不赞成的。因为 HAVING
假设限制条件 (orderId
) 是结果集的一部分。但我认为在这种情况下,使用 HAVING
更有意义(因为它是结果集的一部分),并且比使用 LEFT JOIN
更清晰易懂。
实际上,这可能会稍微慢一些,但请发布结果,以便我们知道它是否比您原来的查询更好。