2013-08-01 32 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