MySQL中有哪些存儲(chǔ)引擎,相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的尖山網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
一、引言
在mysql5之后,支持的存儲(chǔ)引擎有十幾個(gè),但是常用的就那么幾種,而且默認(rèn)支持的也是InnoDB,既然要進(jìn)行一個(gè)對比,我們就要從不同的維度來看一下。
我們可以使用命令來看看當(dāng)前數(shù)據(jù)庫可以支持的存儲(chǔ)引擎有哪些。
在這里我們發(fā)現(xiàn)默認(rèn)支持了9種。還是比較多的,下面我們進(jìn)行一個(gè)對比。
不同的存儲(chǔ)引擎都有各自的特點(diǎn),以適應(yīng)不同的需求,如表所示。為了做出選擇,首先要考慮每一個(gè)存儲(chǔ)引擎提供了哪些不同的功能。
在這里我們列舉了一些特點(diǎn)并作出了比較。下面我們來具體分析對比一下。
1、MyISAM
使用這個(gè)存儲(chǔ)引擎,每個(gè)MyISAM在磁盤上存儲(chǔ)成三個(gè)文件。
(1)frm文件:存儲(chǔ)表的定義數(shù)據(jù)
(2)MYD文件:存放表具體記錄的數(shù)據(jù)
(3)MYI文件:存儲(chǔ)索引
frm和MYI可以存放在不同的目錄下。MYI文件用來存儲(chǔ)索引,但僅保存記錄所在頁的指針,索引的結(jié)構(gòu)是B+樹結(jié)構(gòu)。下面這張圖就是MYI文件保存的機(jī)制:
從這張圖可以發(fā)現(xiàn),這個(gè)存儲(chǔ)引擎通過MYI的B+樹結(jié)構(gòu)來查找記錄頁,再根據(jù)記錄頁查找記錄。并且支持全文索引、B樹索引和數(shù)據(jù)壓縮。
支持?jǐn)?shù)據(jù)的類型也有三種:
(1)靜態(tài)固定長度表
這種方式的優(yōu)點(diǎn)在于存儲(chǔ)速度非???,容易發(fā)生緩存,而且表發(fā)生損壞后也容易修復(fù)。缺點(diǎn)是占空間。這也是默認(rèn)的存儲(chǔ)格式。
(2)動(dòng)態(tài)可變長表
優(yōu)點(diǎn)是節(jié)省空間,但是一旦出錯(cuò)恢復(fù)起來比較麻煩。
(3)壓縮表
上面說到支持?jǐn)?shù)據(jù)壓縮,說明肯定也支持這個(gè)格式。在數(shù)據(jù)文件發(fā)生錯(cuò)誤時(shí)候,可以使用check table工具來檢查,而且還可以使用repair table工具來恢復(fù)。
有一個(gè)重要的特點(diǎn)那就是不支持事務(wù),但是這也意味著他的存儲(chǔ)速度更快,如果你的讀寫操作允許有錯(cuò)誤數(shù)據(jù)的話,只是追求速度,可以選擇這個(gè)存儲(chǔ)引擎。
2、InnoDB
InnoDB是默認(rèn)的數(shù)據(jù)庫存儲(chǔ)引擎,他的主要特點(diǎn)有:
(1)可以通過自動(dòng)增長列,方法是auto_increment。
(2)支持事務(wù)。默認(rèn)的事務(wù)隔離級別為可重復(fù)度,通過MVCC(并發(fā)版本控制)來實(shí)現(xiàn)的。
(3)使用的鎖粒度為行級鎖,可以支持更高的并發(fā);
(4)支持外鍵約束;外鍵約束其實(shí)降低了表的查詢速度,但是增加了表之間的耦合度。
(5)配合一些熱備工具可以支持在線熱備份;
(6)在InnoDB中存在著緩沖管理,通過緩沖池,將索引和數(shù)據(jù)全部緩存起來,加快查詢的速度;
(7)對于InnoDB類型的表,其數(shù)據(jù)的物理組織形式是聚簇表。所有的數(shù)據(jù)按照主鍵來組織。數(shù)據(jù)和索引放在一塊,都位于B+數(shù)的葉子節(jié)點(diǎn)上;
當(dāng)然InnoDB的存儲(chǔ)表和索引也有下面兩種形式:
(1)使用共享表空間存儲(chǔ):所有的表和索引存放在同一個(gè)表空間中。
(2)使用多表空間存儲(chǔ):表結(jié)構(gòu)放在frm文件,數(shù)據(jù)和索引放在IBD文件中。分區(qū)表的話,每個(gè)分區(qū)對應(yīng)單獨(dú)的IBD文件,分區(qū)表的定義可以查看我的其他文章。使用分區(qū)表的好處在于提升查詢效率。
對于InnoDB來說,比較大的特點(diǎn)在于支持事務(wù)。但是這是以損失效率來換取的。
3、Memory
將數(shù)據(jù)存在內(nèi)存,為了提高數(shù)據(jù)的訪問速度,每一個(gè)表實(shí)際上和一個(gè)磁盤文件關(guān)聯(lián)。文件是frm。
(1)支持的數(shù)據(jù)類型有限制,比如:不支持TEXT和BLOB類型,對于字符串類型的數(shù)據(jù),只支持固定長度的行,VARCHAR會(huì)被自動(dòng)存儲(chǔ)為CHAR類型;
(2)支持的鎖粒度為表級鎖。所以,在訪問量比較大時(shí),表級鎖會(huì)成為MEMORY存儲(chǔ)引擎的瓶頸;
(3)由于數(shù)據(jù)是存放在內(nèi)存中,一旦服務(wù)器出現(xiàn)故障,數(shù)據(jù)都會(huì)丟失;
(4)查詢的時(shí)候,如果有用到臨時(shí)表,而且臨時(shí)表中有BLOB,TEXT類型的字段,那么這個(gè)臨時(shí)表就會(huì)轉(zhuǎn)化為MyISAM類型的表,性能會(huì)急劇降低;
(5)默認(rèn)使用hash索引。
(6)如果一個(gè)內(nèi)部表很大,會(huì)轉(zhuǎn)化為磁盤表。
在這里只是給出3個(gè)常見的存儲(chǔ)引擎。使用哪一種引擎需要靈活選擇,一個(gè)數(shù)據(jù)庫中多個(gè)表可以使用不同引擎以滿足各種性能和實(shí)際需求,使用合適的存儲(chǔ)引擎,將會(huì)提高整個(gè)數(shù)據(jù)庫的性能
看完上述內(nèi)容,你們掌握MySQL中有哪些存儲(chǔ)引擎的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!