我有整值的表,我需要通過列的和查詢: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
這是否帶有很大的性能損失或其他缺點?
該表有數百萬行。
無論如何,您無法使用索引來查找'where b + c> 50'(更確切地說:您可以使用索引進行掃描,如果它是覆蓋索引則可以使用;但是您無法直接查找所有具有該條件的行)。使用'ifnull'(或者實際上'coalesce()')進行計算是非常好的,甚至可能無法衡量(除了表格大小下降之外實際速度可能更快)。絕對不要添加列以標記它是否爲空! – Solarflare