如何根據(jù)業(yè)務(wù)選擇合適的存儲(chǔ)引擎?
多存儲(chǔ)引擎是 MySQL 有別于其他數(shù)據(jù)庫(kù)的最大特點(diǎn),不同的存儲(chǔ)引擎有不同的特點(diǎn),可以應(yīng)對(duì)不同的應(yīng)用場(chǎng)景,這給了我們足夠的靈活性去做出選擇。但同時(shí)也帶來(lái)了煩惱,這么多的存儲(chǔ)引擎,我們?cè)撊绾芜x擇最合適的呢?本文將結(jié)合實(shí)際應(yīng)用,介紹選擇存儲(chǔ)引擎的一般原則。
1.需要考慮的因素
對(duì)于如何選擇存儲(chǔ)引擎,可以簡(jiǎn)單地歸納為一句話(huà):“除非需要用到某些 InnoDB 不具備的特性,并且沒(méi)有其他辦法可以替代,否則都應(yīng)該優(yōu)先選擇 InnoDB 引擎”(摘錄自高性能MySQL第三版)。
確實(shí),大部分情況下,InnoDB 都是最好的選擇,從 MySQL 5.5 版本開(kāi)始,將 InnoDB 作為默認(rèn)存儲(chǔ)引擎這一點(diǎn)就是最好的佐證。
選擇不同的存儲(chǔ)引擎,需要考慮以下幾個(gè)因素:
- 事務(wù)
如果應(yīng)用場(chǎng)景需要事務(wù)支持,那么毫無(wú)疑問(wèn),InnoDB是目前最穩(wěn)定的選擇。如果不需要考慮事務(wù),并且應(yīng)用主要以讀操作和插入操作為主,極少有更新和刪除操作,那么MyISAM是比較好的選擇,這種一般指日志型應(yīng)用。
- 備份
如果需要在線(xiàn)熱備,那么應(yīng)該考慮 InnoDB。如果可以定期關(guān)閉服務(wù)器進(jìn)行冷備,那么備份這個(gè)因素可以忽略掉。
- 崩潰恢復(fù)
MyISAM 在崩潰后,發(fā)生數(shù)據(jù)損壞的概率比 InnoDB 高很多,而且恢復(fù)速度也很慢,這也是很多人開(kāi)始棄用 MyISAM 的主要原因之一。特別是數(shù)據(jù)量比較大的應(yīng)用場(chǎng)景,數(shù)據(jù)庫(kù)崩潰后,是否能快速恢復(fù)是一個(gè)非常重要的因素。
一般來(lái)講,如果應(yīng)用場(chǎng)景特別復(fù)雜,以至于搞不清楚需求,無(wú)法確定應(yīng)該使用哪種存儲(chǔ)引擎,那么就使用 InnoDB 吧,這是比較安全的選擇。
2. 轉(zhuǎn)換表的存儲(chǔ)引擎
下面介紹轉(zhuǎn)換存儲(chǔ)引擎的三種方法:
2.1 alter table
下面語(yǔ)句將表 t1 的存儲(chǔ)引擎修改為 InnoDB:
mysql> create table t1(
-> c1 int not null,
-> c2 varchar(10) default null
-> ) engine = myisam;
Query OK, 0 rows affected (0.06 sec)
mysql> alter table t1 engine = innodb;
Query OK, 0 rows affected (0.07 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table t1\G;
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`c1` int(11) NOT NULL,
`c2` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
alter table 的操作需要執(zhí)行比較長(zhǎng)的時(shí)間,它是將原表復(fù)制到一張新的表中,同時(shí)原表加上讀鎖,復(fù)制期間會(huì)耗費(fèi)大量的 IO,所以一般在應(yīng)用空閑時(shí),才可進(jìn)行 alter table 操作。
2.2 導(dǎo)出導(dǎo)入
使用 mysqldump 工具將數(shù)據(jù)導(dǎo)出至文件,修改文件中 create table 語(yǔ)句的存儲(chǔ)引擎選項(xiàng),同時(shí)修改表名,再通過(guò) source 命令進(jìn)行導(dǎo)入操作。
mysql> source table_new_engine.sql
2.3 create和select
這種方法先創(chuàng)建一個(gè)新的存儲(chǔ)引擎表,再通過(guò) insert xxx select xxx 語(yǔ)法導(dǎo)入數(shù)據(jù)
mysql> create table t1(
-> c1 int not null,
-> c2 varchar(10) default null
-> ) engine = myisam;
Query OK, 0 rows affected (0.02 sec)
mysql> create table t1_innodb like t1;
Query OK, 0 rows affected (0.01 sec)
mysql> alter table t1_innodb engine = innodb;
Query OK, 0 rows affected (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> insert into t1_innodb select * from t1;
Query OK, 0 rows affected (0.00 sec)
mysql> show create table t1_innodb\G;
*************************** 1. row ***************************
Table: t1_innodb
Create Table: CREATE TABLE `t1_innodb` (
`c1` int(11) NOT NULL,
`c2` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
3. 小結(jié)
本節(jié)主要學(xué)習(xí)了選擇合適的存儲(chǔ)引擎需要考慮的三個(gè)因素:事務(wù)、備份和崩潰恢復(fù),同時(shí)還學(xué)習(xí)了轉(zhuǎn)換存儲(chǔ)引擎的三種方法:alter table、導(dǎo)出導(dǎo)入、create和select。
以一句話(huà)來(lái)總結(jié)如何選擇合適的存儲(chǔ)引擎:當(dāng)你搞不清楚無(wú)法做出選擇時(shí),InnoDB 是最好的選擇。