Performance
MySQL:為什麼將 NULL 指定為預設值
當我們定義一個表時,我們多次將列的預設值指定為 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”。