我在许多表中添加了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”形式。
答案 0 :(得分:2)
它们都会非常糟糕,因为两者都排除了索引。一个建议是默认值为0
而不是NULL
。这至少会使WHERE
子句能够使用索引。此查询更加优化,因为它可以使用索引:
WHERE k.deleted = 0 AND c.deleted = 0
为清楚起见,我会使用ANSI标准COALESCE()
而不是IFNULL()
。我个人的偏好是OR
,因为我觉得它更清楚。