4

做有什么区别:

SELECT * FROM table WHERE column IS NULL

或者 -

SELECT * FROM table WHERE column = 0

IS NULL的比等同于一个常数要差得多吗?

用例出现在我有类似的地方:

SELECT * FROM users WHERE paying IS NULL

(或添加额外的列)

SELECT * FROM users WHERE is_paying = 0
4

4 回答 4

1

如果我正确理解您的问题,您是在询问两种情况的相对好处/问题:

  • 其中 is_paying = 0
  • 支付为空

鉴于两者都在数据表中,我想不出为什么一个会比另一个表现更好。我确实认为第一个更清楚查询正在做什么,所以这是我更喜欢的版本。但从性能的角度来看,它们应该是相同的。

其他人提到 - 我相信你知道 - NULL 和 0 是不同的野兽。它们在连接和其他元素的优化中也可以表现不同。但是,对于简单的过滤,我希望它们具有相同的性能。

嗯,有一种技术。与“0”的比较可能内置在 CPU 中。与 NULL 的比较可能是一个位操作,需要诸如掩码、移位和比较之类的操作——这可能需要更长的时间。但是,与您从磁盘读取数据的事实相比,这种性能差异可以忽略不计。

于 2012-07-30T02:12:08.353 回答
0

比较NULLzero是两个不同的东西。zero是一个值(已知值),而NULLUNKNOWN。具体zero表示该值设置为zero; null表示该值未设置,或设置为空。

于 2012-07-30T01:15:49.833 回答
-1
于 2012-07-30T01:02:40.067 回答
-1

使用这些查询您将获得完全不同的结果,这不仅仅是性能问题。

假设您有各种各样的用户。有些“支付”列具有非零值,有些具有 0,有些则没有任何值。最后一种情况是“null”或多或少代表的内容。

至于性能,您在“付费”列上有索引吗?如果表中只有几百行,这可能无关紧要。如果您有数千行,则基本上是在告诉查询遍历表的每一行,除非您有一些索引。无论您是在搜索“paying = 0”还是“paying is null”,这都是正确的。

但再次强调,这两个查询会给你完全不同的结果。

于 2012-07-30T01:17:03.920 回答