2012-07-29 169 views
4

是做什么的区别:差异两个类似SQL之间查询性能

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 

回答

1

如果我正确理解你的问题,你是问关于与这两种情况的相对利益/问题:

  • 其中is_paying = 0
  • 当支付是空

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

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

那么,有一种技术。与“0”的比较可能内置于CPU中。与NULL的比较可能需要一些操作,需要像掩码,移位和比较之类的东西 - 这可能需要更长的时间。但是,与从磁盘读取数据的事实相比,此性能差异可以忽略不计。

-1

据我所知比较NULL尽可能快比较0,所以你应该选择基于:

  1. 简单 - 使用选项,使您的代码更简单
  2. 最小尺寸 - 使用使你的表小

在这种情况下使得payingNULL -able可能会更好的选项。

您也应该检查出这些问题:
NULL in MySQL (Performance & Storage)
MySQL: NULL vs “”

0

比较NULLzero是两回事。 zero是一个值(已知值),而NULLUNKNOWNzero具体表示该值设置为zero; null表示该值未设置,或设置为空。

-1

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

假设您有多种用户。有些“支付”列的值非零,有些值为0,有些值没有任何值。最后一种情况是“null”或多或少代表了什么。

至于表现,你有“付费”栏索引?如果你在表中只有几百行,这可能是不相关的。如果你有成千上万的行,你基本上是告诉查询遍历表的每一行,除非你有一些索引。无论您是在搜索“付款= 0”还是“付款为空”,都是如此。

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