Performance

MySQL:為什麼將 NULL 指定為預設值

  • December 17, 2013

當我們定義一個表時,我們多次將列的預設值指定為 NULL。我有

  • NULL 與空值(’’)以及 0 有何不同?
  • NULL 值對查詢性能有影響嗎?
  • 它如何影響在該列上創建的索引?

謝謝…

  • NULL 與空字元串 ’’ 和 0 不同。空字元串和 0 是可用於方程式和其他運算的現有值。

'' = '' is true

0 = 0 is true

NULL = NULL is not true

引用自維基百科

Null 是結構化查詢語言 (SQL) 中使用的特殊標記,用於指示數據庫中不存在數據值。

  • NULL我不確定使用s 而不是''s 或s會對性能產生什麼樣的影響0,但是 AFAIK 不,兩者之間的性能沒有太大差異。如果我錯了,有人可能會糾正我。該規則的一個例外情況如下所述。
  • 首先,NULL你可以UNIQUE INDEX在一個列上有一個,並且仍然有很多 NULL 值。這是 SQL NULL 的定義。在mysql 參考中閱讀更多資訊

此外,如果您使用 InnoDB(我之所以這麼說是因為您的問題被標記為 mysql-5.1),那麼根本不會儲存任何值,這可能會導致儲存空間的大幅減少和可能更快的搜尋(因為更多的行適合一頁)

相反,使用 MyISAM,可空列索引的大小可能會增加,從而導致所需的儲存空間略有增加。

最後,使用 NULL 列既不是壞事,也不是好習慣。再加上糟糕的設計,它們可能會讓人頭疼。但是通過良好的設計,它們是有用且有幫助的。NULL 列應該在精心設計的數據庫中佔有一席之地,它們只是不適用於每一列。

我不相信你會通過使用空值來獲得很多性能,並且索引應該大致相同。B 樹仍然必須有一個指向 NULL 記錄的節點,就像空字元串或 0 一樣。

作為應用程序開發人員,您通常希望盡可能遠離數據庫中的 NULL。原因是當在尚未設置且為空的欄位中提取數據時,必須將其轉換為可以在 UI 層中呈現的內容。我們已經看到由此引發的性能問題,在插入時在數據庫中設置一個適當的預設值會更快,然後在讀取記錄的多次時不進行強制轉換。當然,這取決於您的應用程序的特定需求。

此外,NULL 通常會殺死針對它們執行的任何類型的計算或連接。“Bob” + NULL 例如是 NULL,其中 “Bob” + "" 是 “Bob”。

引用自:https://dba.stackexchange.com/questions/55176