17

假设我有一个表,其列的值从 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)
4

5 回答 5

19

使用“IN”,因为它很可能使 DBMS 使用相应列上的索引。

理论上,“NOT IN”也可以转换为索引使用,但是以一种更复杂的方式,DBMS 可能不会“花费开销时间”使用。

于 2013-06-03T07:35:56.043 回答
12

当涉及到性能时,您应该始终分析您的代码(即运行您的查询几千次并使用某种stopwatch.示例测量每个循环的性能。来测量每个循环的性能)。

但在这里我强烈建议使用第一个查询以便更好地维护。逻辑是您需要除 9 和 10 之外的所有记录。如果将值 11 添加到表中并使用第二个查询,则应用程序的逻辑将被破坏,这当然会导致错误。

编辑:我记得这被标记为 php,这就是我在 php 中提供示例的原因,但我可能弄错了。我想用您使用的语言重写该示例并不难。

于 2013-06-03T07:14:52.967 回答
3

如果列可以为空,我已经看到 Oracle 在使用 NOT IN 优化某些查询时遇到了麻烦。如果您可以用任何一种方式编写查询,就我而言,IN 是首选。

于 2013-06-03T07:17:18.580 回答
1

对于常量列表,MySQL 将在内部将您的代码扩展为:

SELECT * FROM tbl WHERE ((col <> 9 and col <> 10))

另一个也一样,改为 8 次=

所以是的,第一个会更快,需要做的比较更少。虽然可以测量的可能性微乎其微,但与解析 SQL 和检索数据的一般开销相比,少量持续比较的开销微不足道。

于 2013-06-03T07:16:24.523 回答
1

“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”要好得多。

于 2020-06-19T14:01:40.053 回答