(“”OR null)在where子句中的VS NOT(!“”AND NOT NULL)

时间:2010-08-25 12:24:20

标签: mysql performance

有没有人知道mysql中SQL字符串的下列部分之间是否存在性能差异?

   WHERE ...  AND (field = "" OR field IS NULL);

  WHERE ...  AND (NOT (field != "" AND field IS NOT NULL));

5 个答案:

答案 0 :(得分:8)

虽然它有可忽略的小,但是很小,我无法分辨哪个会更快,哪个更慢。这更具有可读性 - 在这种情况下,我会选择前者。

答案 1 :(得分:4)

因此没有性能差异。它更多的是关于代码可读性的。当然,第一个陈述更具可读性。

我想补充的另一件事是在考虑优化时。我们不应该深入研究微优化,因为这并不能真正增加性能,因为差异非常小,最终会浪费时间和资源,使代码可读性降低,可维护性降低,易于管理。

所以每当想到优化时,描述你的代码,并开始改进你的应用程序设计,数据库设计,利用缓存等等。而不是沉迷于关于回声是否更快或印刷的讨论(一个例子)

答案 2 :(得分:3)

有性能差异。在您编写查询的方式中,它取决于变量“ field ”的值 在查询“ WHERE ... AND(field =”“OR字段IS NULL); ”如果 field =“” TRUE 字段IS NULL 将不会被检查TRUE或FALSE。但如果 field =“” FALSE ,则字段IS NULL 将被检查为TRUE或FALSE。完成的比较次数取决于“字段”的值 在查询 WHERE ... AND(NOT(字段!=“”AND字段IS非空)); 字段!=“”是否为TRUE或FALSE,< strong>字段IS NOT NULL 将被检查为TRUE或FALSE。因此,在任何一种情况下,比较将进行两次。最后检查 NOT 。因此总体上有三个比较 我更喜欢前者,但差别可以忽略不计 最好不要使用“ NOT ”,尽管考虑到今天的编译器和系统配置,性能差异不会很大。

答案 3 :(得分:1)

根据SQL Server(至少MSSQL)中NULL的默认行为是:

  

VALUE Logical_Operator NULL == FALSE

, - 任何带NULL的布尔运算符都会导致FALSE(特殊运算符“IS NULL”除外)。所以在你的第二个表达

  

“AND field IS NOT NULL”

是多余的部分,因为

  

(NULL!=“”)== FALSE

现在回到你的问题。第一个表达式应该更慢,因为当我们请求sql server选择字段为NULL的行时, - 服务器不能在该字段上使用INDEX,并使用普通表扫描(查看执行计划)。因此,我的主要建议是永远不要在任何查询中使用空值 - 更好地使用预定义符号标记空字段或仅使用空字符串。

修改: 我在mssql上看过'笑话',在某些情况下,下面的构造会比第一个表达式(可能是第二个表达式)运行得更快:

  

在哪里......和COALESCE(字段,“”)=“”

我最好的解释是,sql server不喜欢 OR 的情况,因为通过查看查询执行计划(带OR情况),很明显服务器将查询分成几个部分,执行这些部分后 - 合并两个OR部分查询的结果。在任何情况下,您都可以为性能实验添加第三个候选项。

答案 4 :(得分:0)

这两个是等价的,应该用完全相同的计划执行。如果它们不存在则不能保证仅仅因为a)执行速度比b)更快,那么它们总会这样做。

两者的等价性是基本Boolean Algebra的直接应用。如果你还没有机会,那么值得你花时间去上课或阅读一篇文章。基础知识不是一个特别大的学科领域,概念并不是特别难(你可能已经知道很多,虽然可能不是正式的),但是一旦你用拇指掌握它们,理解这些规则就会得到很好的回报。