簡體   English   中英

MySQL:在大表中添加一個字段

[英]MySQL: add a field to a large table

我有一張約200,000條記錄的表格。 我想為它添加一個字段:

 ALTER TABLE `table` ADD `param_21` BOOL NOT NULL COMMENT 'about the field' AFTER `param_20`

但它似乎是一個非常繁重的查詢,它需要很長時間,即使在我的Quad amd PC上有4GB的RAM。

我在windows / xampp和phpMyAdmin下運行。 在添加字段時,mysql是否與每條記錄都有業務往來? 或者我可以更改查詢,以便更快地進行更改嗎?

幾乎在所有情況下,MySQL都會在ALTER **期間重建表。 這是因為基於行的引擎(即所有這些引擎)必須這樣做才能以正確的格式保留數據以進行查詢。 這也是因為您還可以進行許多其他更改,這些更改還需要重建表(例如更改索引,主鍵等)

我不知道你正在使用什么引擎,但我會假設MyISAM。 MyISAM復制數據文件,進行任何必要的格式更改 - 這相對較快,並且不太可能花費比IO硬件可以獲取舊數據文件和新數據文件更長的時間。

重建索引真的是殺手鐧。 根據你配置的方式,MySQL將:對於每個索引,將索引列放入文件存儲緩沖區(可能在內存中但通常在光盤上),使用其filesort()函數對其進行排序(快速排序)通過遞歸復制兩個文件之間的數據(如果它對於內存來說太大),然后根據排序的數據構建整個索引。

如果它不能執行filesort技巧,它就會像在每一行上執行INSERT一樣,並依次用每行的數據填充索引塊。 這非常緩慢,導致遠離最佳索引。

您可以在此過程中使用SHOW PROCESSLIST來判斷它正在做什么。 “通過filesort修復”很好,“使用keycache修復”很糟糕。

所有這些都將使用AT MOST一個核心,但有時也會受到IO綁定(特別是復制數據文件)。

**有一些例外,例如在innodb插件表上刪除二級索引。

您添加NOT NULL列,需要填充元組。 所以它會很慢......

這會觸及每條200.000條記錄,因為每條記錄都需要使用新的bool值進行更新,該值不會為空。

所以; 是的,這是一個昂貴的查詢...沒有什么可以做的,使它更快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM