在MySQL,IFNULL或OR逻辑中哪个更好

时间:2017-06-10 14:07:44

标签: mysql

我在许多表中添加了deleted列,并且我有一个查询,表明LEFT JOIN跨9个表,并且想要检查每个表的deleted列。

出于工作流原因,我将删除的列设置为TINYINT而不是BIT,以便在多个“已删除”值方面具有一定的灵活性。我希望NULL 零表示“未删除”,而任何其他非空,非零值表示“已删除”。我可以在WHERE子句中看到两种方法:

WHERE (k.deleted IS NULL OR k.deleted = 0) 
   AND (c.deleted IS NULL OR c.deleted = 0)
   ... 

或者

WHERE IFNULL(k.deleted,0) = 0
   AND IFNULL(c.deleted,0) = 0
   ... 

效率在这个查询中很重要,因为它是一个返回零或一条记录的9表LEFT JOIN,它运行 lot 所以我真的需要最高效率。我认为IFNULL看起来更优雅,但我有一种唠叨的感觉,即MySQL可能使用与WHERE子句中的AND / OR逻辑不同的函数来优化查询。除非我另有说明,否则为了安全起见,我会使用更详细的“OR”形式。

1 个答案:

答案 0 :(得分:2)

它们都会非常糟糕,因为两者都排除了索引。一个建议是默认值为0而不是NULL。这至少会使WHERE子句能够使用索引。此查询更加优化,因为它可以使用索引:

WHERE k.deleted = 0 AND c.deleted = 0

为清楚起见,我会使用ANSI标准COALESCE()而不是IFNULL()。我个人的偏好是OR,因为我觉得它更清楚。