Mysql
MySQL:將大型 MyISAM 表更改為 InnoDB (17gb+) 的最佳配置/方法
我有一個大型 MySQL (5.1) MyISAM 表(13gb 表,4GB 索引 - 40mm+ 記錄)
- 我將在生產環境中將此表轉換為 InnoDB。
數據庫位於具有 8GB RAM 的雲伺服器上(可能會升級到 30GB RAM 僅用於轉換)。
一種方法是簡單地編寫一個 ALTER 查詢:
哪些設置和配置最適合以這種方式盡可能快速順利地進行轉換?
我讀過的一些建議設置:
- 大 innodb_buffer_pool_size (4GB 是最大的可能嗎?)
- 使用 shell 命令預讀舊的 myisam 數據/索引文件
- 增加 innodb_log_file_size (這種情況下最好的大小是多少?)
- 在 X 個並行執行緒中執行 alter table,其中 X 是伺服器上 CPU 核心的數量(你怎麼能這樣做?)
- 其他小調整(innodb_doublewrite=0,innodb_flush_log_at_trx_commit=0)
注意:這裡的類似問題(但具有不同伺服器大小 的小表範例): https ://stackoverflow.com/questions/2081823/speeding-up-conversion-from-myisam-to-innodb/2081871#2081871
當然,還有其他方法可以做到這一點:
- 對舊表執行 MYSQLDUMP 並重新插入到新的干淨 InnoDB 表中,
- 執行“SELECT * … INSERT INTO…”查詢,或
- 對舊表執行“SELECT INTO OUTFILE…”查詢,然後對新表執行“LOAD DATA INFILE…”查詢
1. 您將如何配置您的設置以使此更改盡可能快速和順利進行?
2. 你認為哪種方法是最好的選擇?
建議 #1
假設您的雲伺服器上有相當多的磁碟空間。您分階段創建 InnoDB 表以觀察磁碟空間和 RAM 的慢動作效果。
假設您的 MyISAM 表被呼叫
mydb.mytable
,並且您想將其轉換為 InnoDB。嘗試以下操作:
CREATE TABLE mydb.mytable_new LIKE mydb.mytable; ALTER TABLE mydb.mytable_new ENGINE=InnoDB; INSERT INTO mydb.mytable_new SELECT * FROM mydb.mytable; ALTER TABLE mydb.mytable RENAME mydb.mytable_old; ALTER TABLE mydb.mytable_new RENAME mydb.mytable;
玩桌子。
如果你喜歡它的性能,那麼
DROP TABLE mydb.mytable_old;
如果你不喜歡它的表現,那麼
TRUNCATE TABLE mydb.mytable_old; INSERT INTO mydb.mytable_old SELECT * FROM mydb.mytable; ALTER TABLE mydb.mytable RENAME mydb.mytable_zap; ALTER TABLE mydb.mytable_old RENAME mydb.mytable; DROP TABLE mydb.mytable_zap;
建議 #2
您提到您正在執行 MySQL 5.1。除非您安裝 InnoDB 外掛,否則 InnoDB 是單執行緒的。要使 InnoDB 成為多執行緒:
一旦你做任何一個,請配置 InnoDB 以使用多個核心。看我過去的文章:
May 26, 2011
:關於單執行緒與多執行緒數據庫的性能Sep 12, 2011
:可以讓 MySQL 使用多個核心嗎?Sep 20, 2011
:多核和 MySQL 性能