2017-09-29 61 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是我更新了我的答案 –