MySQL表轉換(轉換/修改表存儲引擎):
有幾種方法可以吧表從一種引擎轉移到另外一種引擎上,都有自己的優缺點。下面介紹3種常用的方法。
一:ALTER TABLE
把表從一種引擎轉移到另外一種引擎最簡單快捷的方法用ALTER TABLE語句:
mysql>ALTER TABLE mytablename ENGINE = 引擎類型
詳細介紹該用法:這種語法適合所有的存儲引擎,不過這裡有一個“陷阱”:這種轉換過程會消耗大量時間。MySQL為此要執行一個舊表到新表的逐行復制(Row-By-Row Copy)。在這期間,轉換操作可能會占用服務器得所有I/O處理能力,並且在轉換時,源表要被加讀鎖。因此,在一個繁忙的表上做此操作,要加以注意。作為替代手斷,可以使用下面這個方法,它會先做個表拷貝。
如果從一個引擎到另一種引擎做表轉換,所有屬於原始引擎的專用特性都會丟失,例如,如果將一個innoDB表轉換成MyISAM表,在轉回來,那麼最初定義在原InnoDB表上的所有外鍵都會丟失。
二:轉儲(Dump) 和導入(Import)
如果想對表轉換的過程做更多控制,可以選擇使用mysqldump工具,將表先轉儲(dump)成一個文本文件,在編輯轉儲文件(dump file),修改其中的CREATE TABLE語句。一定要注意修改表名和引擎類型,因為即便引擎類型有所不同,統一數據庫種也不允許存在同一表名的兩張表。另外,mysqldump在CREATE TABLE語句前,會默認地加上drop table 命令,如果不注意,可能因此丟失原有數據。
三:CREATE 和 SELECT
這種方法轉換,在第一種方法的速度與第二種方法的安全性之間做了一個平衡。它不是轉儲整張表,或者一次性轉換所有的數據,而是創建一個新表,使用MySQL的INSERT...SELECT語法來轉移數據。如下:
mysql>CREATE TABLE innodb_table LIKE myisam_table;
mysql>ALTER TABLE innodb_table ENGINE=innoDB;
mysql>INSERT INTO innodb_table SELECT * FROM myisam_table;
如果數據數據量大,這種辦法效果不錯。但是更高效的辦法是增量地填充表,在填充每個增量數據塊的時候都提交事務,這樣就不會導致撤銷日志(Undo Log)變得過於龐大。假定id是主鍵,可以重復運行下列查詢(每次逐次增大x和y的值),直至所有的數據都復制到新表。
mysql>START TRANSACTION;
mysql>INSERT INTO innodb_table SELECT * FROM myisam_table WHERE id BETWEEN x AND y;
mysql>COMMIT;
轉移操作完成後,源表仍會保留,可以在操作完成後刪除(drop)它,而此時,新表已經被填充完畢。注意:如有必要,請在轉換時加鎖源表,防止轉移復制數據不一致的問題