MySQL 轉換/修改表格儲存體引擎 詳細介紹,mysql引擎
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)它,而此時,新表已經被填充完畢。注意:如有必要,請在轉換時加鎖源表,防止轉移複製資料不一致的問題