2013-08-01 29 views
0

据我所知,应尽可能避免在数据库中为空列。何时可空列严重影响性能?

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

换句话说,null是什么时候真的伤害了性能? (相对于它微不足道,根本无关紧要)。

我在问,所以我可以知道它何时以及如何实际上有所作为。

+0

[可能相关的问题。](http://stackoverflow.com/questions/229179/null-in-mysql-performance-storage) – Mike

+0

是的,这是同样的问题。但是,这个结论似乎是主观和不明确的。初步结论似乎是:1)“担心NULL对性能的影响是微优化领域”和2)“如果你在列上有一个索引,那是NULL,MySQL需要更多的逻辑来选择,排序等“。有没有人根据实际情况拥有更多的坚实证据? – forthrin

回答

3

不知道你在哪里听到它,但这不是事实。

可用空列来精确表示数据:如果值未知或尚未输入,则NULL是存储的自然值。空值与存储或检索任何其他类型的值相比并不繁琐:大多数数据库服务器将它们存储在一个位中,这意味着与组装varchar相比,它将花费更少的I/O和处理器努力来检索NULL值, BLOB或来自可能需要遍历链接列表的一堆碎片的文本字段,或从硬盘读取更多磁盘块。

有一对夫妇的实例略有相关到可能影响性能的空列:如果您创建一个空的列的索引

  1. ,并在列中的实际值是稀疏的(即多行具有NULL值,或者只有很少的值存在(例如用于控制的词汇表值),用于索引列的b-树数据结构变得效率低得多。当一半的索引遍历成为更昂贵的操作时索引中的值是相同的:最终会得到不平衡的树。

  2. 使用NULL值或不使用NULL值的不恰当的查询技术,因为它们的设计经常会导致性能较差,因为程序员往往会回避搜索或连接计算列值的不良习惯,而忽略现代数据库服务器的奇妙设置处理能力。我在很多地方咨询,其中开发人员做出书面条款的习惯,如:

    WHERE ISNULL(myColumn, '') = ''

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

+0

我的意见是基于进一步发布的链接:http://stackoverflow.com/questions/229179。关于答案1:如果许多行具有相同的非空值,那么这种情况是否也适用? – forthrin

+0

是的。指数失衡是任何类型的“笨拙”数据的人为因素。 – Curt