何时在 MySQL 表中使用 NULL

2024-01-27

我很欣赏数据库表中 NULL 值的语义,它不同于 false 和空字符串 ''。然而,我经常读到有关字段可为空时的性能问题的信息,并建议在 NULL 实际上在语义上正确的情况下使用空字符串。

什么情况适合使用可为空字段和 NULL 值?有哪些权衡?完全避免使用 NULL 并简单地使用空字符串、 false 或 0 来指示值不存在是否明智?

UPDATE

好的 - 我了解 '' 和 NULL 之间的语义差异以及 NULL 是适当字段值的(与性能无关的)情况。不过,让我详细阐述一下暗示的性能问题。这是来自 Schwartz、Zeitsev 等人的优秀《高性能 MySQL》http://www.borders.co.uk/book/high-performance-mysql-optimization-backups-replication-and-more/857673/ http://www.borders.co.uk/book/high-performance-mysql-optimization-backups-replication-and-more/857673/:

MySQL 更难优化 引用可为空的列的查询, 因为他们制作索引,索引 统计和价值比较更多 复杂的。可空列使用 更多的存储空间和要求 MySQL内部的特殊处理。什么时候 可为空列建立索引,它 每个条目需要一个额外的字节并且 甚至会导致固定大小的索引 (例如单个整数的索引 列)转换为 MyISAM 中的可变大小。

更多这里:

这很可能是最终的答案——我只是在寻找来自一线的第二意见和经验。


然而,我经常读到 当字段是时的性能问题 可为 null 并被建议使用 如果 NULL 为空字符串 实际上在语义上是正确的。

我暂时会对用词挑剔一下:

  • 即使它是一个重要的性能因素,但这并不意味着它语义上正确使用值而不是 NULL。在 SQL 中,NULL 具有语义作用,表示缺失或不适用的值。给定 RDBMS 实现中 NULL 的性能特征与此无关。性能可能因品牌或版本不同而有所不同,但 NULL 在语言中的用途是一致的。

无论如何,我还没有听说过任何证据表明 NULL 表现不佳。我对任何显示可空列的性能比不可空列差的性能测量的参考感兴趣。

我并不是说我没有错,或者在某些情况下这不可能是真的——只是说做出无聊的假设是没有意义的。科学不是由猜想组成的,而是由猜想组成的。必须通过可重复的测量来提供证据。

指标还告诉您how much性能有所不同,因此您可以判断是否值得担心。也就是说,影响可能是可衡量的且非零,但与更大的性能因素(例如正确索引表或调整数据库缓存大小)相比仍然微不足道。

在 MySQL 中,搜索 NULL 可以从索引中受益:

mysql> CREATE TABLE foo (
  i INT NOT NULL,
  j INT DEFAULT NULL,
  PRIMARY KEY (i),
  UNIQUE KEY j_index (j)
);

mysql> INSERT INTO foo (i, j) VALUES 
  (1, 1), (2, 2), (3, NULL), (4, NULL), (5, 5);

mysql> EXPLAIN SELECT * FROM foo WHERE i = 3;
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref   | rows | Extra |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
|  1 | SIMPLE      | foo   | const | PRIMARY       | PRIMARY | 4       | const |    1 |       | 
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+

mysql> EXPLAIN SELECT * FROM foo WHERE j IS NULL;
+----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key     | key_len | ref   | rows | Extra       |
+----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+
|  1 | SIMPLE      | foo   | ref  | j_index       | j_index | 5       | const |    2 | Using where | 
+----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+

请注意,这仍然不是性能的衡量标准。我仅表明您可以在搜索 NULL 时使用索引。我要断言(诚然没有进行测量,但这只是 StackOverflow)索引的好处掩盖了搜索 NULL 与空白字符串时任何可能的损失。

选择零或空白或任何其他值来代替 NULL 不是正确的设计决策。您可能需要在列中使用这些重要值。这就是 NULL 存在的原因,根据定义,它作为任何数据类型值域之外的值,因此您可以使用整数或字符串或其他任何值的完整范围,并且仍然有一些东西可以表示“以上值都不是”。 ”

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

何时在 MySQL 表中使用 NULL 的相关文章

随机推荐

  • sparql 精确匹配正则表达式

    我使用以下 sparql 查询从 dbpedia 中提取与特定信息框匹配的页面 PREFIX dbo
  • 共享会话与默认配置的会话

    两者有什么区别session以这两种不同方式创建的对象 NSURLSession session NSURLSession sharedSession and NSURLSessionConfiguration configuration
  • 返回后更新导航抽屉的选定状态

    后按后处理导航抽屉的选定状态的正确方法是什么 我有一个带有 n 个条目的导航抽屉 在列表视图中 就像 Android Studio 中的 SDK 示例一样 当我单击导航抽屉条目时 我希望将它们添加到后堆栈中 以便我可以返回到它们 在 onN
  • 如何更改 Vaadin 中的默认 HTML 模板

    我正在使用 Vaadin 和 Maven 应用程序 我想要的是更改默认的 html 模板 当我运行该应用程序时 生成的 HTML 如下所示
  • 我需要帮助为 SpeechSynthesizer 创建词典。某种模板,这样我就可以知道如何创建一个

    或多或少就是标题所说的 我希望创建一个希腊语文本到语音的词典 这样我就可以为 SpeechSynthesizer 创建我的语言 我在哪里可以找到某种模板 或者一些指导 或者您可以提供的任何内容都是可以接受的 因为 SpeechSynthes
  • Iron Python:Iron Python 有什么好处 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对 python 很感兴趣 但我在 NET 环境中工作 所以我正在研究 Iron Python 并想知道它的用途 你能在里面写一个应
  • 使用多处理模块

    我正在尝试使用 python 2 6 中的多处理模块 但显然有一些我不明白的东西 我希望下面的类将通过 add 发送给它的数字相加 并在 get result 方法中返回总和 下面的代码打印 0 我希望它打印 2 我错过了什么 import
  • 无法将非有限值(NA或inf)转换为整数[重复]

    这个问题在这里已经有答案了 我有一个数据框看起来像这样 survived pclass sex age sibsp parch fare embarked 0 1 1 female 29 0000 0 0 211 3375 S 1 1 1
  • 在android studio中导入类[重复]

    这个问题在这里已经有答案了 我是 Android Studio 的新手 我不知道如何在Android Studio中导入类 使用快捷键 I have used Ctrl 1 like Eclipse but it s not working
  • Swift - 从闭包中退出外部函数

    在 Kotlin 中 您可以从闭包的外部函数返回 fun main args Array
  • 如何使用基于 .Net 类属性的值自动更新 WPF TreeViewItems?

    早上好 我有一个类 其中包含从 InotifyPropertyChange 派生的数据 数据来自后台线程 该线程在特定位置搜索具有特定扩展名的文件 类的公共属性通过在单独的线程中更新数据来对事件 OnPropertyChange 做出反应
  • 如何使用 d3 画布渲染器添加鼠标事件以强制定向图?

    所有其他示例都有带有 svg append 的鼠标事件 我不知道在哪里 输入 以获取画布渲染器中的弧并添加 on click function v4 风格 我想点击获取值d 在此示例中 我应该在哪里添加处理程序 我理解这个例子下面的旧方法
  • stunnel https 被重定向到 http

    我有一个在端口 8081 上侦听的 Web 服务 它是在单声道上运行的 ServiceStack REST Web 服务 如果有帮助的话 我正在尝试使用 stunnel 来保护它 但问题是一旦我连接到https ip https ip 它被
  • 语言切换器,使用 symfony 重定向到当前页面

    在 symfony 中进行语言切换并重定向到所选语言的同一页面的最佳方法是什么 Jobeet 只是在主页上进行重定向 像这样的事情应该可以解决问题
  • 使用 Bash 正则表达式匹配 (=~),其中正则表达式包含引号(" 字符)

    我想使用 Bash 正则表达式匹配 使用 运算符 来匹配包含引号的字符串 举例来说 我有以下字符串 我想提取引号之间的文本 foo Hello World 我的第一次尝试是将正则表达式放在强引号中 以强制引号为常规字符 foo 这会失败 因
  • 找不到类“bolts.AppLinks”

    当我尝试在设备上启动 Android 应用程序时 崩溃并出现奇怪的错误 这个问题从前两天就出现了 这是错误 11 09 17 27 30 461 25146 25146 com ten ten E AndroidRuntime FATAL
  • 如何使用 boto 以编程方式检查 Amazon S3 权限?

    我们在 Amazon S3 的存储桶中有一棵茂密的树 其中包含大量文件 我刚刚发现 虽然有些文件有两个权限条目 如单击 AWS 管理控制台中的一个文件 然后单击属性 gt 权限 一行是 所有人 另一行是某个特定用户 其他文件只有一个该用户的
  • 将类函数转换为 lambda 函数

    我正在尝试拉出这样的东西 class helper some class variables public function somehelper somevar some action to somehelper somevar 我希望它
  • Android通知大图样式和大文本样式

    我已经使用大图片样式构建了推送通知 如图所示here http developer android com reference android app Notification BigPictureStyle html 是否可以混合大图片样
  • 何时在 MySQL 表中使用 NULL

    我很欣赏数据库表中 NULL 值的语义 它不同于 false 和空字符串 然而 我经常读到有关字段可为空时的性能问题的信息 并建议在 NULL 实际上在语义上正确的情况下使用空字符串 什么情况适合使用可为空字段和 NULL 值 有哪些权衡