做有什么区别:
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
如果我正确理解您的问题,您是在询问两种情况的相对好处/问题:
鉴于两者都在数据表中,我想不出为什么一个会比另一个表现更好。我确实认为第一个更清楚查询正在做什么,所以这是我更喜欢的版本。但从性能的角度来看,它们应该是相同的。
其他人提到 - 我相信你知道 - NULL 和 0 是不同的野兽。它们在连接和其他元素的优化中也可以表现不同。但是,对于简单的过滤,我希望它们具有相同的性能。
嗯,有一种技术。与“0”的比较可能内置在 CPU 中。与 NULL 的比较可能是一个位操作,需要诸如掩码、移位和比较之类的操作——这可能需要更长的时间。但是,与您从磁盘读取数据的事实相比,这种性能差异可以忽略不计。
比较NULL
和zero
是两个不同的东西。zero
是一个值(已知值),而NULL
是UNKNOWN。具体zero
表示该值设置为zero
; null
表示该值未设置,或设置为空。
使用这些查询您将获得完全不同的结果,这不仅仅是性能问题。
假设您有各种各样的用户。有些“支付”列具有非零值,有些具有 0,有些则没有任何值。最后一种情况是“null”或多或少代表的内容。
至于性能,您在“付费”列上有索引吗?如果表中只有几百行,这可能无关紧要。如果您有数千行,则基本上是在告诉查询遍历表的每一行,除非您有一些索引。无论您是在搜索“paying = 0”还是“paying is null”,这都是正确的。
但再次强调,这两个查询会给你完全不同的结果。