我已经将deleted列添加到许多表中,并且我有一个查询,该查询在9个表中保留联接,并希望检查每个表的deleted列。
由于工作流的原因,我将已删除的列设置为TINYINT,而不是为了某种灵活性而使之具有多个“删除”值。我想要空或零的意思是“不删除”,任何其他非空,非零值的意思是“删除”。我可以在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表左联接,而且它运行了很多,所以我真的需要最大的效率。我认为IFNULL看起来更优雅,但我觉得MySQL可能会在WHERE子句中使用与AND / OR逻辑不同的函数来优化查询。除非我听到另一种说法,否则我将使用更详细的“或”形式,只是为了安全起见。
发布于 2017-06-10 14:11:24
它们都会非常糟糕,因为它们都排除了索引。一种建议是缺省值,因此它是0而不是NULL。这至少会使WHERE子句能够使用索引。这个查询更优化,因为它可以使用索引:
WHERE k.deleted = 0 AND c.deleted = 0为了清晰起见,我将使用ANSI标准COALESCE()而不是IFNULL()。我个人更喜欢OR,因为我认为它更清晰。
https://stackoverflow.com/questions/44474250
复制相似问题