簡體   English   中英

優化 mySql 以更快地更改表添加列

[英]Optimize mySql for faster alter table add column

我有一個表,它有 170,002,225 行,大約有 35 列和兩個索引。 我想添加一列。 alter table 命令花費了大約 10 個小時。 在此期間,處理器似乎並不忙,也沒有過多的 IO 等待。 這是一個帶有大量內存的 4 路高性能盒子。

這是我能做的最好的嗎? 有什么我可以看的東西來優化數據庫調整中的添加列嗎?

我過去遇到過非常相似的情況,我以這種方式提高了操作的性能:

  1. 創建一個包含新列的新表(使用當前表的結構)。
  2. 執行INSERT INTO new_table (column1,..columnN) SELECT (column1,..columnN) FROM current_table;
  3. 重命名當前表
  4. 使用當前表的名稱重命名新表。

MySQL中的ALTER TABLE實際上是要創建一個具有新模式的新表,然后重新INSERT所有數據並刪除舊表。 您可以通過創建新表、加載數據然后重命名表來節省一些時間。

來自“高性能 MySQL 書”(percona 人):

有效加載 MyISAM 表的常用技巧是禁用鍵、加載數據和腎為鍵:

mysql> ALTER TABLE test.load_data DISABLE KEYS;
-- load data
mysql> ALTER TABLE test.load_data ENABLE KEYS;

好吧,我建議使用最新的 Percona MySQL 版本,因為 MySQL 手冊中有以下說明

在其他情況下,即使數據並不嚴格需要復制,MySQL 也會創建一個臨時表。 對於 MyISAM 表,您可以通過將 myisam_sort_buffer_size 系統變量設置為高值來加快索引重新創建操作(這是更改過程中最慢的部分)。

您可以先執行ALTER TABLE DISABLE KEYS ,然后添加列,然后ALTER TABLE ENABLE KEYS 我看不到這里可以做任何事情。

順便說一句,你不能去MongoDB嗎? 添加列時它不會重建任何內容。

也許您可以在更改表之前刪除索引,因為構建索引所需的大部分時間是什么?

結合對其他答案的一些評論,這是對我有用的解決方案(MySQL 5.6):

  1. create table mytablenew like mytable;
  2. alter table mytablenew add column col4a varchar(12) not null after col4;
  3. alter table mytablenew drop index index1, drop index index2,...drop index indexN;
  4. insert into mytablenew (col1,col2,...colN) select col1,col2,...colN from mytable;
  5. alter table mytablenew add index index1 (col1), add index index2 (col2),...add index indexN (colN);
  6. rename table mytable to mytableold, mytablenew to mytable

在一個 75M 的行表上,在插入之前刪除索引導致查詢在 24 分鍾而不是 43 分鍾內完成。

其他答案/評論已insert into mytablenew (col1) select (col1) from mytable ,但這會導致ERROR 1241 (21000): Operand should contain 1 column(s) if you have the parenthesis in the select query.

其他答案/評論已insert into mytablenew select * from mytable; ,但這會導致ERROR 1136 (21S01): Column count doesn't match value count at row 1如果您已經添加了一列,則列ERROR 1136 (21S01): Column count doesn't match value count at row 1

暫無
暫無

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

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