概述
mysql5.5之前默認(rèn)存儲(chǔ)引擎是MyISAM孝冒,5.5之后改為InnoDB。若要修改默認(rèn)引擎拟杉,可以修改配置文件中的default-storage-engine
庄涡。可以通過(guò)show engines
來(lái)查看當(dāng)前數(shù)據(jù)庫(kù)支持的引擎搬设。使用select engine from information_schema.engines where transactions = 'yes';
來(lái)查看哪些引擎支持事務(wù)穴店。在創(chuàng)建表到時(shí)候通過(guò)engine=...或type=...
來(lái)指定所要使用到引擎。
MyISAM
它不支持事務(wù)拿穴,也不支持外鍵泣洞,其優(yōu)勢(shì)是訪(fǎng)問(wèn)的速度快,對(duì)事務(wù)完整性沒(méi)有要求的或者以select/insert為主的應(yīng)用基本上可以使用這個(gè)引擎來(lái)創(chuàng)建表默色。
-
每個(gè)MyISAM在磁盤(pán)上都有3個(gè)文件球凰,其文件名都與表名相同,但擴(kuò)展名是:
- .frm(表定義)
- .MYD(MYDate:存儲(chǔ)數(shù)據(jù))
- .MYI(MYIndex:存儲(chǔ)索引)
.MYD文件和.MYI文件可以放置在不同的目錄中该窗,通過(guò) data directory 和index directory語(yǔ)句指定弟蚀。
MyISAM類(lèi)型的表可能會(huì)損壞,可以使用CHECK TABLE語(yǔ)句來(lái)檢查MyISAM表的健康酗失,并用REPAIR TABLE語(yǔ)句修復(fù)一個(gè)損壞到MyISAM表义钉。
-
MyISAM支持3種不同的存儲(chǔ)格式:
- 靜態(tài)(固定長(zhǎng)度)表
- 動(dòng)態(tài)表
- 壓縮表
在靜態(tài)表中,如果需要保存的內(nèi)容后面本來(lái)就帶有空格规肴,那么在返回結(jié)果的時(shí)候會(huì)去掉公共的捶闸。
在動(dòng)態(tài)表中,記錄不固定拖刃,優(yōu)點(diǎn)是占用空間相對(duì)比較少删壮,缺點(diǎn)是頻繁的更新和刪除記錄會(huì)產(chǎn)生碎片,需要定期執(zhí)行optimize table 來(lái)改善性能兑牡。
在壓縮表中央碟,由myisampack工具創(chuàng)建,占據(jù)非常小的磁盤(pán)空間均函。因?yàn)槊總€(gè)記錄都被單獨(dú)壓縮的亿虽。
InnoDB
- InnoDB支持事務(wù)安全,對(duì)比MyISAM引擎苞也,InnoDB寫(xiě)的效率差一些洛勉,并且會(huì)占據(jù)更多的磁盤(pán)空間。
- InnoDB自動(dòng)增長(zhǎng)列可以手工插入如迟,但是插入的值是空或者0收毫,則實(shí)際插入的將是自動(dòng)增長(zhǎng)后的值攻走。可以使用
last_insert_id()
查詢(xún)當(dāng)前線(xiàn)程最后插入記錄使用的值此再∥袈В可以通過(guò)alert table *** auto_increment=n;
語(yǔ)句強(qiáng)制設(shè)置自動(dòng)增長(zhǎng)值。 - 對(duì)于InnoDB表引润,自動(dòng)增長(zhǎng)列必須是索引巩趁。如果是組合索引痒玩,也必須是組合索引的第一列淳附,但是對(duì)于MyISAM表,自動(dòng)增長(zhǎng)列可以是組合索引的其他列蠢古,這樣插入記錄后奴曙,自動(dòng)增長(zhǎng)列是按照組合索引到前面幾列排序后遞增的。
-
MySQL
支持外鍵
的存儲(chǔ)引擎只有InnoDB
草讶,在創(chuàng)建外鍵的時(shí)候洽糟,父表必須有對(duì)應(yīng)的索引,子表在創(chuàng)建外鍵的時(shí)候也會(huì)自動(dòng)創(chuàng)建對(duì)應(yīng)的索引堕战。在創(chuàng)建索引的時(shí)候坤溃,可以指定在刪除、更新父表時(shí)嘱丢,對(duì)子表進(jìn)行的相應(yīng)操作薪介,包括restrict、cascade越驻、set null和no action
汁政。其中restrict和no action相同,是指限制在子表有關(guān)聯(lián)的情況下缀旁,父表不能更新记劈;casecade表示父表在更新或刪除時(shí),更新或者刪除子表對(duì)應(yīng)的記錄并巍;set null 則表示父表在更新或者刪除的時(shí)候目木,子表對(duì)應(yīng)的字段被set null。當(dāng)某個(gè)表被其它表創(chuàng)建了外鍵參照懊渡,那么該表對(duì)應(yīng)的索引或主鍵被禁止刪除刽射。可以使用set foreign_key_checks=0;
臨時(shí)關(guān)閉外鍵約束距贷,set foreign_key_checks=1;
打開(kāi)約束柄冲。 - InnoDB存儲(chǔ)表和索引有如下兩種方式:
- 使用共享表空間存儲(chǔ)。
- 使用多表空間存儲(chǔ)忠蝗。
MEMORY
- memory使用存在內(nèi)存中的內(nèi)容來(lái)創(chuàng)建表现横。每個(gè)MEMORY表實(shí)際對(duì)應(yīng)一個(gè)磁盤(pán)文件,格式是.frm。MEMORY類(lèi)型的表訪(fǎng)問(wèn)非辰潇簦快骇两,因?yàn)樗綌?shù)據(jù)是放在內(nèi)存中的,并且默認(rèn)使用HASH索引姜盈,但是一旦服務(wù)器關(guān)閉低千,表中的數(shù)據(jù)就會(huì)丟失,但表還會(huì)繼續(xù)存在馏颂。
- 每個(gè)MEMORY表中放置到數(shù)據(jù)量的大小示血,受到max_heap_table_size系統(tǒng)變量的約束,這個(gè)系統(tǒng)變量的初始值是16M救拉,同時(shí)在創(chuàng)建MEMORY表時(shí)可以使用MAX_ROWS子句來(lái)指定表中的最大行數(shù)难审。
- memory主要用于那些內(nèi)容變化不頻繁的代碼表,或作為統(tǒng)計(jì)操作的中間結(jié)果表亿絮。
MERGE
- merge存儲(chǔ)引擎是一組MyISAM表的組合告喊,這些MyISAM表結(jié)構(gòu)必須完全相同,MERGE表中并沒(méi)有數(shù)據(jù)派昧,對(duì)MERGE類(lèi)型的表可以進(jìn)行查詢(xún)黔姜、更新、刪除的操作蒂萎,這些操作實(shí)際上是對(duì)內(nèi)部的MyISAM表進(jìn)行操作秆吵。
- 對(duì)于對(duì)MERGE表進(jìn)行的插入操作,是根據(jù)INSERT_METHOD子句定義的插入的表岖是,可以有3個(gè)不同的值帮毁,first和last值使得插入操作被相應(yīng)的作用在第一個(gè)或最后一個(gè)表上,不定義這個(gè)子句或者為NO豺撑,表示不能對(duì)這個(gè)MERGE表進(jìn)行插入操作烈疚。
- 可以對(duì)MERGE表進(jìn)行drop操作,這個(gè)操作只是刪除MERGE表的定義聪轿,對(duì)內(nèi)部的表沒(méi)有任何影響爷肝。
- MERGE在磁盤(pán)上保留2個(gè)以MERGE表名開(kāi)頭文件:.frm文件存儲(chǔ)表的定義;.MRG文件包含組合表的信息陆错,包括MERGE表由哪些表組成灯抛,插入數(shù)據(jù)時(shí)的依據(jù)∫舸桑可以通過(guò)修改.MRG文件來(lái)修改MERGE表对嚼,但是修改后要通過(guò)flush table刷新。
- merge表與分區(qū)表的區(qū)別是:merge表不會(huì)智能的將記錄寫(xiě)到對(duì)應(yīng)的表中绳慎,而分區(qū)表可以的纵竖。
總結(jié)
仍一張表作為總結(jié):