MySQL-哪种方法更好地检查列是空的还是空的

MySQL-哪种方法更好地检查列是空的还是空的,mysql,isnull,Mysql,Isnull,当我们要选择列中不包含任何内容的记录时,我们可以使用: SELECT * FROM my_table WHERE NULLIF(my_column, '') IS NULL; SELECT * FROM my_table WHERE my_column IS NULL OR my_column = '' 但是,在大多数情况下,我看到开发人员使用以下方法: SELECT * FROM my_table WHERE NULLIF(my_column, '') IS NULL; SELECT *

当我们要选择列中不包含任何内容的记录时,我们可以使用:

SELECT * FROM my_table WHERE NULLIF(my_column, '') IS NULL;
SELECT * FROM my_table WHERE my_column IS NULL OR my_column = ''
但是,在大多数情况下,我看到开发人员使用以下方法:

SELECT * FROM my_table WHERE NULLIF(my_column, '') IS NULL;
SELECT * FROM my_table WHERE my_column IS NULL OR my_column = ''
这两者之间有什么偏好吗?(例如性能、默认支持、版本支持等)


如果是,请解释。

据我所知,关于执行时间或性能的最佳方法是:

SELECT * FROM my_table WHERE my_column = ''

参考:

通常,人们之所以会包含=''部分,是因为SQL Server将其存储为空字符串,这与NULL不同

参考链接:
对字段(在条件中)调用函数会自动丢弃该字段上可用于加速查询的任何潜在索引。在条件列表中使用
通常也会执行相同的操作(但对于所有索引)

然而,对于前者,您最终会对每一行进行函数调用;对于后者,有可能利用短路评估

当然,还有第三个选项可以利用索引

SELECT * FROM my_table WHERE my_column IS NULL
UNION
SELECT * FROM my_table WHERE my_column = ''

但是,联合/两个查询的成本可能会超过索引使用的好处;取决于实际数据。

这两种结构不同。发件人:

因此,此逻辑正在测试列的“
NULL
或空字符串”

  • 如果
    my_column
    当前为空,函数将返回其值(NULL…),因为它不等于空字符串
  • 如果
    my_column
    是空字符串,则函数将返回NULL
  • 如果有任何其他值,将返回该值
我完全同意Naveed的回答:“这是‘可爱’……不要‘可爱’”。他的回答(“使用
…)产生了非常简单的SQL,乍一看就显而易见。这一“聪明”的解决方案并非如此。(而且它的启动效率可能稍低一些。)


当然,在设计数据库时,您确实希望避免这种必要性。您永远不希望在VARCHAR类型字段中存储“空字符串”,除非“我们有一个非空值,而该值实际上是一个“空字符串”。

在一行上计算两个表达式不应该有这么大的差异。人们使用第二个版本的原因是使用索引。Mysql对此有一个特殊的优化,甚至可以和
一起使用

为空优化

MySQL可以对col_name=constant_value使用的col_name为NULL执行相同的优化。例如,MySQL可以使用索引和范围来搜索带有IS NULL的NULL

如果WHERE子句包含声明为NOTNULL的列的col_name IS NULL条件,则该表达式将被优化掉。当列可能产生空值时,这种优化不会发生;例如,如果它来自左联接右侧的表

MySQL还可以优化col_name=expr或col_name为NULL的组合,这是在已解析的子查询中常见的一种形式。EXPLAIN在使用此优化时显示ref_或_null


正如我在上面的回答中所说,“纳维德的解决方案对任何人来说都是显而易见的。”而且“在我的书中,每次都能赢得比赛。”我并不真正关心微秒。但是,我真的很担心清晰度。我不希望人类读者为了弄明白这句话的意思,为了确保它真的在做我认为它在做的事情和我想要的事情,不得不去争抢MySQL文档(就像我做的那样…),我知道这一点。我提出的两个查询都是一样的。我的问题是哪一个更好?我会把两者都包括在内。它不会让你在性能上花费太多,这样你就能确保它做你想做的事情。明白了。关于你的最后一段,我并不总是从头开始设计DB的人。有时,我面对一个有数百万条记录的表,不允许我更改结构。顺便说一句,谢谢你的解释。我不知道我是否会称之为“可爱”。在这个特定的上下文中,这似乎有些过分,但是在一组更大的条件下(可能有许多这样的检查),使用这种形式(或者“IFNULL(x)”)=”)可以使查询更具可读性。。。必须“读取”数据的人并不总是编写数据的人。哦,是的,Mojtaba,这是“现实世界的状态!”:-)我们都必须处理包含数百万条“保持原样”的记录的数据库。查询优化器是否可以“优化”
NULLIF()是一个有趣的问题
而不是将其作为真正的函数调用处理。(它是否会像文档中建议的那样用
案例
来代替它?它可能…####我“乍一看”并不认为基于
联盟
的替代方案真的有效,只是“宁愿不必再看第二眼或第三眼就知道它是否有效。”我敢说查询优化器足够聪明,可以使用索引。因此,我宁愿看到“简单”而不是“聪明”。但是,“那就是我。”基于联合的替代方案始终是我最后的选择,因为它几乎会复制一个查询(这可能比实际复制查询更糟糕),但是我可以从经验中确认,MySQL不会优化OR子句以获得相同的好处。随着全套条件变得更加复杂,它的适用性也变得不太可能,这可能是MySQL不尝试以类似方式对其进行优化的原因@MikeRobinsonI觉得你应该把被接受的答案改成Solarflare的。Mine处理函数vs
情况;他们的回答给出了
…的确切原因。。。为空或…
优越。@uuerdo,慷慨而温和;)