mysql - 可空列何时会严重影响性能?

标签 mysql

据我了解,应尽可能避免数据库中可为空的列。

但是,在哪些特定情况下可为空列实际上会导致性能显着下降?

换句话来说,null 什么时候会真正损害性能? (而不是当它可以忽略不计,并且根本不重要时)。

我这样问是为了知道它何时以及如何真正产生影响。

最佳答案

不知道你从哪里听说的,但这不是真的。

可空列用于准确表示数据:如果值未知或尚未输入,则 NULL 是要存储的自然值。存储或检索 Null 值并不比任何其他类型的值更麻烦:大多数数据库服务器将它们存储在一位中,这意味着检索 NULL 值所需的 I/O 和处理器工作量比组装 varchar 少, BLOB,或来自一堆片段的文本字段,可能需要遍历链接列表,或从硬盘驱动器读取更多磁盘 block 。

有几个实例与可能会影响性能的可空列有一定的相关:

  1. 如果在可为空的列上创建索引,并且该列中的实际值是稀疏的(即许多行都有 NULL 值,或者只存在很少的值(例如,使用受控的列)词汇表值),用于索引列的 B 树数据结构的效率会大大降低。当索引中的一半值相同时,索引遍历将变得更加昂贵:最终会得到一棵不平衡的树。

    <
  2. 不恰本地使用 NULL 值,或者在设计时不使用 NULL 值的不适当查询技术通常会导致性能不佳,因为程序员经常会陷入搜索或连接计算列值的坏习惯,它忽略了现代数据库服务器出色的集处理能力。我咨询过很多地方,开发人员养成了这样的习惯:

    WHERE ISNULL(myColumn, '') = ''

这意味着数据库服务器不能直接使用索引,并且必须对执行树的该部分的每一行执行计算以评估查询。这并不是因为存储、比较或评估 NULL 值本身效率低下,而是因为查询阻碍了数据库引擎实现特定结果的优势。

关于mysql - 可空列何时会严重影响性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18005269/

相关文章:

PHP 无法打印 mysql_query() 结果

MySQL 数据在 Toad Edge 中可见,但在 CLI 中不可见

mysql - 如何在mysql表中存储多个值

mysql - 如何进行插入或删除?

带有子查询的 mySQL UPDATE WHERE 给出错误

mysql - 无法避免重复插入数据库

mysql - 无法添加外键约束 (GUID)

PHP 和 MYSQL 按小数列排序

mysql - 分片和 ID 生成作为 instagram

php - INET6_ATON 的替代 MySQL 代码