2010-12-20 15 views
0

我有一張有相當多條目的表格。 我需要一個帶整數值或null的附加列。 事情是,只有非常少的行將填充該字段。具有空值的Mysql列 - 空間要求是什麼?

所以我想知道是否更好地創建一個單獨的表,我以1:1的關係鏈接條目。

我知道一個整數項需要mysql/myisam中的4個字節。如果我將列設置爲允許空值,並且100000行中只有100行填充了字段,那麼其餘每個空值都會消耗4個字節?

或者是mysql智能足以設置它填充的值,只是把所有東西都視爲null,沒有設置任何東西?

回答

1

這取決於您在創建表格時所給予的ROW_FORMAT值。

在版本5.0.3之前,默認格式設置爲「REDUNDANT」:任何固定長度的字段將使用相同的空間,即使它的值爲NULL。

從版本5.0.3開始,該值設置爲「COMPACT」:NULL值永遠不會在數據庫中使用任何空間。

你可以做一個ALTER TABLE就一定要使用正確的格式:

ALTER TABLE ... ROW_FORMAT=COMPACT 

更多細節在這裏: http://dev.mysql.com/doc/refman/5.1/en/data-size.html

+0

它怎麼可能使用零空間來存儲空值它有什麼?成本的東西是不可能記住的值 – 2010-12-20 17:38:38

+0

@nate c ...以及只存儲數據和沒有相應部分的每個數據都是隱含的null – 2010-12-20 18:14:08

+0

該鏈接中沒有任何內容告訴如何存儲空值。我存儲了6列的整數,其中的值是33,44,66三列隱含爲空,它們是哪三列?這就是零存儲。至少需要一個位域來告訴哪些列存在,哪些不存在。 – 2010-12-20 18:46:57

0

就我的理解而言,一旦將一個字段聲明爲int,則將爲其留出4個字節。因此,對於100,000行,您正在查看〜400 KB的空間。

如果空間是一個約束,那麼單獨的表會更好。另一方面,如果績效是一個標準,那麼你必須考慮該領域被查詢的次數以及是否存在或不存在。無論哪種情況,您都需要加入。如果你想檢查字段是否設置,你可以使用內部連接,這將比單個表查詢慢。如果你想檢查是否存在,你將需要左/右外連接,這將比內連接慢。

0

它將使用位字段來存儲空值,因此,它可能需要不到一字節。但是,即使它 - 誰在乎,除非你使用3.5" 軟盤到後端存儲;-)

NULL in MySQL (Performance & Storage)