轉換MyISAM表到InnoDB |
發(fā)布時間: 2012/8/26 16:00:36 |
要點:你不應該在mysql數(shù)據(jù)庫(比如,user或者host)里把MySQL系統(tǒng)表轉換為InnoDB類型。系統(tǒng)表總是MyISAM型。 如果你想要所有(非系統(tǒng))表都被創(chuàng)建成InnoDB表,你可以簡單地把default-table-type=innodb行添加到my.cnf或my.ini文件的[mysqld]節(jié)里。 電腦入門www.boydavid.com InnoDB對MyISAM存儲引擎采用的單獨索引創(chuàng)建方法沒有做專門的優(yōu)化。因此,它不值得導出或導入表以及隨后創(chuàng)建索引。改變一個表為InnoDB型最快的辦法就是直接插入進一個InnoDB表。即,使用ALTER TABLE ... ENGINE=INNODB,或用相同的定義創(chuàng)建一個空InnoDB表,并且用INSERT INTO ... SELECT * FROM ...插入行。 電腦常識www.boydavid.com 如果你對第二個鍵有UNIQUE約束,你可以在導入階段設置:SET UNIQUE_CHECKS=0,以臨時關掉唯一性檢查好加速表的導入。對于大表,這節(jié)省了大量的磁盤I/O,因為InnoDB隨后可以使用它的插入緩沖區(qū)來第二個索引記錄作為一批來寫入。 為獲得對插入進程的更好控制,分段插入大表可能比較好: INSERT INTO newtable SELECT * FROM oldtable
WHERE yourkey > something AND yourkey <= somethingelse;
所有記錄已經(jīng)本插入之后,你可以重命名表。
在大表的轉換中,你應該增加InnoDB緩沖池的大小來減少磁盤I/O。盡管如此,不要使用超過80%的內部內存。你也可以增加InnoDB日志文件和日志文件的大小。 確信你沒有填滿表空間:InnoDB表比MyISAM表需要大得多的磁盤空間。如果一個ALTER TABLE耗盡了空間,它就開始一個回滾,并且如果它是磁盤綁定的,回滾可能要幾個小時。對于插入,InnoDB使用插入緩沖區(qū)來以成批地合并第二個索引記錄到索引中。那樣節(jié)省了大量磁盤I/O。在回滾中,沒有使用這樣的機制,而回滾要花比插入長30倍的時間來完成。 在失控的回滾情況下,如果你在數(shù)據(jù)庫中沒有有價值的數(shù)據(jù),比較明智的是殺掉數(shù)據(jù)庫進程而不是等幾百萬個磁盤I/O被完成。 完整的過程,請參閱15.2.8.1節(jié),“強制恢復”。 本文出自:億恩科技【mszdt.com】 |