2017-09-29 62 views
0

我有整值的表,我需要通過列的和查詢:mysql確實ifnull(...)阻礙索引使用?

id, A, B, C 
    1, 21, 32, null 
    2, 9, 0, 124 
    3, null, null, 6 

SELECT * FROM tbl WHERE B+C > 50 

這不起作用,因爲與空增加是不允許的。當前的實現是將所有空值設置爲0,併爲每列狀態添加一個單獨的列,如果0實際上意味着空:

id, A, B, C, A_null, B_null, C_null 
1, 21, 32, 0, false, false, true 
2, 9, 0, 124, false, false, false 
3, 0, 0, 6, true, true, false 

我不認爲這是非常優雅,想利用的ifnull函數:

SELECT * FROM tbl WHERE ifnull(B,0)+ifnull(C,0) > 50 

這是否帶有很大的性能損失或其他缺點?

該表有數百萬行。

+0

無論如何,您無法使用索引來查找'where b + c> 50'(更確切地說:您可以使用索引進行掃描,如果它是覆蓋索引則可以使用;但是您無法直接查找所有具有該條件的行)。使用'ifnull'(或者實際上'coalesce()')進行計算是非常好的,甚至可能無法衡量(除了表格大小下降之外實際速度可能更快)。絕對不要添加列以標記它是否爲空! – Solarflare

回答

0

你總是可以使用

isnull(column_name ,0) 

這將插入一個0到空值,然後它可以讓你來總結他們。

ifnull和isnull之間的區別-ifnull接受兩個參數;一個用於如果該值爲空,另一個用於如果該值不是。

isnull只是簡單地插入一個值到所有的空值,我認爲這將是公平更簡單的問題。

+0

ifnull有什麼區別? – Chris

+0

根據文檔isnull只需要1個參數並返回true或false。所以它不是替代ifnull – Chris

+0

@Chris是我更新了我的答案 –