我有這個大表(數十萬條記錄)必須添加一列。該列僅存儲布爾值(tinyint 0/1)。MySQL添加列而不添加任何物理數據/增加存儲使用量?
目標是避免額外存儲使用已存在的記錄,因爲它們將默認爲NULL/0,將來可以設置爲1,但不是一次也不是全部。
那麼NULL是否需要一些存儲空間?或者將添加一個NULL-capable列添加任何物理數據到現有的行?
我有這個大表(數十萬條記錄)必須添加一列。該列僅存儲布爾值(tinyint 0/1)。MySQL添加列而不添加任何物理數據/增加存儲使用量?
目標是避免額外存儲使用已存在的記錄,因爲它們將默認爲NULL/0,將來可以設置爲1,但不是一次也不是全部。
那麼NULL是否需要一些存儲空間?或者將添加一個NULL-capable列添加任何物理數據到現有的行?
約翰回答到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很少使用,就可以節省大量空間。
(我假設你正在使用InnoDB存儲引擎以及緊湊的行格式)
在實踐中:
你使用什麼存儲引擎和行格式?您可以通過查詢information_schema來查看:'select engine,row_format from information_schema.tables where table_schema ='your_schema'and table_name ='your_table';' –
@IkeWalker MyISAM,dynamic(我無法影響這些設置) –
創建新表存儲新描述的列是最好的方式(據我所知!)和JOIN與大表使用。有人建議我在答覆中提到過。 @ jave.web – MohaMad