2017-02-28 43 views
0

我有這個大表(數十萬條記錄)必須添加一列。該列僅存儲布爾值(tinyint 0/1)。MySQL添加列而不添加任何物理數據/增加存儲使用量?

目標是避免額外存儲使用已存在的記錄,因爲它們將默認爲NULL/0,將來可以設置爲1,但不是一次也不是全部。

那麼NULL是否需要一些存儲空間?或者將添加一個NULL-capable列添加任何物理數據到現有的行?

+0

你使用什麼存儲引擎和行格式?您可以通過查詢information_schema來查看:'select engine,row_format from information_schema.tables where table_schema ='your_schema'and table_name ='your_table';' –

+0

@IkeWalker MyISAM,dynamic(我無法影響這些設置) –

+0

創建新表存儲新描述的列是最好的方式(據我所知!)和JOIN與大表使用。有人建議我在答覆中提到過。 @ jave.web – MohaMad

回答

0

約翰回答到this Question約「MySQL的:多少空間做一個NULL字段使用

如果將某個字段設置爲NOT NULL將採取在MyISAM中更小的空間。

將其設置爲接受空值會使其在MyISAM中佔用更多空間。

InnoDB空值佔用較少的空間,所以它可能在那裏工作。

在他的回答

,它提供了創建新表,而不是你的大表上添加新列:

另一種選擇是的字段添加到這個表,但是做

table extra_data 
    id integer primary key 
    big_table_id integer 
    large_data_seldom_used varchar(65000) 

如果您需要選擇額外的數據做:

SELECT large_data_seldom_used FROM bigtable b 
INNER JOIN extra_data e ON (e.big_table_id = b.id) 

這樣,您不必爲bigtable添加額外的字段,如果extra_field很少使用,就可以節省大量空間。

0

(我假設你正在使用InnoDB存儲引擎以及緊湊的行格式)

In theory

  • 的NULL值將分別採取存儲1位的記錄頭中的NULL位向量
  • 非NULL值將分別佔用1個字節的存儲空間

在實踐中:

  • 添加新列會導致表重建,在大多數情況下會導致數據進行碎片整理,使其佔用更少的磁盤空間比以前,但情況因人而異