假设我有一个表,其列的值从 1 到 10。我需要选择除 9 和 10 之外的所有值的列。当我使用此查询时是否会有差异(性能方面):
SELECT * FROM tbl WHERE col NOT IN (9, 10)
和这个?
SELECT * FROM tbl WHERE col IN (1, 2, 3, 4, 5, 6, 7, 8)
假设我有一个表,其列的值从 1 到 10。我需要选择除 9 和 10 之外的所有值的列。当我使用此查询时是否会有差异(性能方面):
SELECT * FROM tbl WHERE col NOT IN (9, 10)
和这个?
SELECT * FROM tbl WHERE col IN (1, 2, 3, 4, 5, 6, 7, 8)
使用“IN”,因为它很可能使 DBMS 使用相应列上的索引。
理论上,“NOT IN”也可以转换为索引使用,但是以一种更复杂的方式,DBMS 可能不会“花费开销时间”使用。
当涉及到性能时,您应该始终分析您的代码(即运行您的查询几千次并使用某种stopwatch
.示例测量每个循环的性能。来测量每个循环的性能)。
但在这里我强烈建议使用第一个查询以便更好地维护。逻辑是您需要除 9 和 10 之外的所有记录。如果将值 11 添加到表中并使用第二个查询,则应用程序的逻辑将被破坏,这当然会导致错误。
编辑:我记得这被标记为 php,这就是我在 php 中提供示例的原因,但我可能弄错了。我想用您使用的语言重写该示例并不难。
如果列可以为空,我已经看到 Oracle 在使用 NOT IN 优化某些查询时遇到了麻烦。如果您可以用任何一种方式编写查询,就我而言,IN 是首选。
对于常量列表,MySQL 将在内部将您的代码扩展为:
SELECT * FROM tbl WHERE ((col <> 9 and col <> 10))
另一个也一样,改为 8 次=
。
所以是的,第一个会更快,需要做的比较更少。虽然可以测量的可能性微乎其微,但与解析 SQL 和检索数据的一般开销相比,少量持续比较的开销微不足道。
“IN”语句在内部像一系列“OR”语句一样工作。
例如:
SELECT * FROM tbl WHERE col IN (1, 2, 3)
它等于
SELECT * FROM tbl WHERE col = 1 OR col = 2 OR col = 3
如本文所述,“OR”语句可能会导致一些性能问题: https ://bertwagner.com/2018/02/20/or-vs-union-all-is-one-better-for-performance/
当您执行 NOT IN 语句时,它们都是一样的,但结果是逻辑否定。但是,您可以在性能上更好地编写和等效查询。在您的示例中:
SELECT * FROM tbl WHERE col NOT IN (9, 10)
它等于
SELECT * FROM tbl WHERE col <> 9 AND col <> 10
使用“AND”语句,当所有条件之一为假时,数据库停止分析,因此,它的性能比“IN”语句中使用的“OR”要好得多。