我有整值的表,我需要通过列的和查询: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