2012-07-29 171 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」還是「付款爲空」,都是如此。

但是,再次強調,這兩個查詢會給你完全不同的結果。