Mysql-5
加快 MyISAM 到 InnoDB 的轉換
我有一個 mysql 5.1 伺服器,它的數據庫大約有 450 個表,佔用 4GB 。這些表中的絕大多數(除了 2 個)都是 MyIsam。這在大多數情況下都很好(不需要事務),但是應用程序一直在獲得流量,並且某些表由於更新時的表鎖定而受到影響。這就是現在有 2 個表是 InnoDB 的原因。
較小表(100k 行)上的轉換根本不需要很長時間,導致停機時間最短。然而,我的一些跟踪表接近 5000 萬行。有沒有辦法加快
ALTER TABLE...ENGINE InnoDB
大桌子的速度?如果沒有,是否還有其他方法可以將這些寫入繁重的表的停機時間最小化?
首先讓我說,我討厭 ALTER。這是邪惡的,恕我直言。
說,這是您目前的表架構 -
CREATE TABLE my_table_of_love ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, my_value VARCHAR(40), date_created DATE, PRIMARY KEY(id) ) ENGINE=MyISAM CHARSET=utf8;
這是我推薦的路徑 -
創建一個將替換舊表對象的新表對象:
CREATE TABLE my_table_of_love_NEW ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, my_value VARCHAR(40), date_created DATE, PRIMARY KEY(id) ) ENGINE=InnoDB CHARSET=utf8
按名稱將舊表中的所有行插入到新表中:
INSERT INTO my_table_of_love_NEW (id,my_value,date_created) SELECT id,my_value,date_created FROM my_table_of_love;
冒煙測試您的遷移:
SELECT COUNT(*) FROM my_table_of_love_NEW; SELECT COUNT(*) FROM my_table_of_love; SELECT a.id,a.my_value,a.date_created FROM my_table_of_love_NEW a LEFT JOIN my_table_of_love b ON (b.id = a.id) WHERE a.my_value != b.my_value;
交換錶名,以便在需要回滾時維護備份。
RENAME TABLE my_table_of_love TO my_table_of_love_OLD; RENAME TABLE my_table_of_love_NEW TO my_table_of_love;
繼續進行回歸測試。
對於具有多個索引和數百萬行的表,這種方法變得越來越可取。
想法?