據我所知,應儘可能避免在數據庫中爲空列。何時可空列嚴重影響性能?
但是,在哪些特定情況下可空列實際上會導致顯着的性能下降?
換句話說,null是什麼時候真的傷害了性能? (相對於它微不足道,根本無關緊要)。
我在問,所以我可以知道它何時以及如何實際上有所作爲。
據我所知,應儘可能避免在數據庫中爲空列。何時可空列嚴重影響性能?
但是,在哪些特定情況下可空列實際上會導致顯着的性能下降?
換句話說,null是什麼時候真的傷害了性能? (相對於它微不足道,根本無關緊要)。
我在問,所以我可以知道它何時以及如何實際上有所作爲。
不知道你在哪裏聽到它,但這不是事實。
可用空列來精確表示數據:如果值未知或尚未輸入,則NULL是存儲的自然值。空值與存儲或檢索任何其他類型的值相比並不繁瑣:大多數數據庫服務器將它們存儲在一個位中,這意味着與組裝varchar相比,它將花費更少的I/O和處理器努力來檢索NULL值, BLOB或來自可能需要遍歷鏈接列表的一堆碎片的文本字段,或從硬盤讀取更多磁盤塊。
有一對夫婦的實例略有相關到可能影響性能的空列:如果您創建一個空的列的索引
,並在列中的實際值是稀疏的(即多行具有NULL值,或者只有很少的值存在(例如用於控制的詞彙表值),用於索引列的b-樹數據結構變得效率低得多。當一半的索引遍歷成爲更昂貴的操作時索引中的值是相同的:最終會得到不平衡的樹。
使用NULL值或不使用NULL值的不恰當的查詢技術,因爲它們的設計經常會導致性能較差,因爲程序員往往會迴避搜索或連接計算列值的不良習慣,而忽略現代數據庫服務器的奇妙設置處理能力。我在很多地方諮詢,其中開發人員做出書面條款的習慣,如:
WHERE ISNULL(myColumn, '') = ''
這意味着DB服務器不能直接使用索引,而且必須執行的計算在執行樹的該部分的每一行上評估查詢。這並不是因爲在存儲,比較或計算NULL值時存在內在的低效率,而是因爲查詢阻礙了數據庫引擎的優勢以實現特定結果。
[可能相關的問題。](http://stackoverflow.com/questions/229179/null-in-mysql-performance-storage) – Mike
是的,這是同樣的問題。但是,這個結論似乎是主觀和不明確的。初步結論似乎是:1)「擔心NULL對性能的影響是微優化領域」和2)「如果你在列上有一個索引,那是NULL,MySQL需要更多的邏輯來選擇,排序等「。有沒有人根據實際情況擁有更多的堅實證據? – forthrin