1.5 MySQL的存儲引擎
MySQL將每個(gè)數(shù)據(jù)庫(schema ski:m?)保存在數(shù)據(jù)目錄下的一個(gè)子目錄僵控。創(chuàng)建表時(shí),會(huì)創(chuàng)建一個(gè)與表同名的 .frm 文件鱼冀。
通過以下命令报破,可以查看表信息
mysql> SHOW TABLE STATUS LIKE 'USER' \G
1.5.1 InnoDB存儲引擎
InnoDB是MySQL的默認(rèn)事務(wù)引擎,也是最重要的千绪,使用最廣泛的存儲引擎充易。它被設(shè)計(jì)用來處理大量的短期事務(wù),短期事務(wù)大部分情況是正常提交的荸型,很少會(huì)被回滾盹靴。
InnoDB歷史
略...
InnoDB概覽
InnoDB采用MVCC來支持高并發(fā),并且實(shí)現(xiàn)了四個(gè)標(biāo)準(zhǔn)的隔離級別瑞妇。默認(rèn)級別為 可重復(fù)讀稿静,并且通過間隙鎖策略防止幻讀的出現(xiàn)。
InnoDB表是基于聚簇索引建立的辕狰。聚簇索引對主鍵查詢有很高的性能改备。不過它的二級索引中必須包括主鍵列,所以如果主鍵列很大的話柳琢,其他的所有索引都會(huì)很大绍妨。
InnoDB的存儲格式是平臺獨(dú)立的,也是就是說可以將數(shù)據(jù)和索引文件在不同平臺中互相復(fù)制柬脸。
InnoDB通過一些機(jī)制和工具支持真正的熱備份他去。
1.5.2 MyISAM 存儲引擎
略
1.5.3 MySQL內(nèi)建的其他存儲引擎
略
1.5.4 第三方存儲引擎
略
1.5.5 選擇合適的引擎
考慮因素:
1.事務(wù)
如果應(yīng)用需要事務(wù)支持,那么InnoDB是目前最穩(wěn)定的經(jīng)過驗(yàn)證的選擇倒堕。如果不需要事務(wù)灾测,主要是SELECT和INSERT操作,那么MyISAM是不錯(cuò)的選擇。一般日志型的應(yīng)用比較符合這一特性媳搪。
2.備份
如果需要在線熱備份铭段,那么選擇InnoDB就是基本的要求。
3.崩潰回復(fù)
MyISAM崩潰后發(fā)生損壞的概率比InnoDB要高很多秦爆,而且恢復(fù)速度也要慢序愚。所以,即使不需要事務(wù)支持等限,也應(yīng)選擇InnoDB引擎爸吮。
1.5.6 轉(zhuǎn)換表的引擎
ALTER TABLE
mysql> ALERT TABLE table_name ENGING = InnoDB;
執(zhí)行時(shí)間長,MySQl會(huì)按行將數(shù)據(jù)從原表復(fù)制到一張新表中望门,在復(fù)制期間可能會(huì)消耗系統(tǒng)所有的I/O能力形娇,同時(shí)原表會(huì)加上讀鎖。
同時(shí)會(huì)丟失原引擎相關(guān)的所有特性筹误。
導(dǎo)出與導(dǎo)入
使用 mysqldump 工具將數(shù)據(jù)導(dǎo)出到文件桐早。同時(shí)要在執(zhí)行語句前加上DROP TABLE table_name語句;
創(chuàng)建和查詢
mysql> create table users_copy like users;? ? #根據(jù)目標(biāo)表創(chuàng)建新表
mysql> alter table users_copy engine=innodb;??? #修改新表引擎類型
mysql> insert into users_copy select * from users;??? #將目標(biāo)表數(shù)據(jù)導(dǎo)入新表
如果數(shù)據(jù)量大,可以考慮分批處理厨剪。
mysql> start transaction;
mysql> insert into users_copy select * from users where between x and y;
mysql> commit;
為了避免手工操作導(dǎo)致的失誤和問題哄酝,可以使用 pt-online-schema-change 進(jìn)行操作。