3种mysql的储存机制_MySQL三种InnoDB、MyISAM和MEMORY存储引擎对比
三種引擎的區(qū)別:
事務(wù):InnoDB支持事務(wù),MyISAM和MEMORY兩個不支持。
存儲限制:InnoDB有64TB的存儲限制,MyISAM和MEMORY要跟具體情況而定。
空間使用:InnoDB對空間使用程度較高,MyISAM和MEMORY對空間使用程度較低。
內(nèi)存使用:InnoDB和MEMORY對內(nèi)存使用程度較高,MyISAM對內(nèi)存使用程度較低。
插入數(shù)據(jù)的速度:InnoDB插入數(shù)據(jù)的速度較低,MyISAM和MEMORY插入數(shù)據(jù)的速度較高。
對外鍵的支持:InnoDB對外鍵支持情況較好,MyISAM和MEMORY兩個不支持外鍵。
1.InnoDB
InnoDB是事務(wù)型數(shù)據(jù)庫的首選引擎,支持事務(wù)安全表(ACID),其它存儲引擎都是非事務(wù)安全表,支持行鎖定和外鍵,MySQL5.5以后默認(rèn)使用InnoDB存儲引擎。
它的主要特點有:
(1)可以通過自動增長列,方法是auto_increment。
(2)支持事務(wù)。默認(rèn)的事務(wù)隔離級別為可重復(fù)度,通過MVCC(并發(fā)版本控制)來實現(xiàn)的。
(3)使用的鎖粒度為行級鎖,可以支持更高的并發(fā);
(4)支持外鍵約束;外鍵約束其實降低了表的查詢速度,但是增加了表之間的耦合度。
(5)配合一些熱備工具可以支持在線熱備份;
(6)在InnoDB中存在著緩沖管理,通過緩沖池,將索引和數(shù)據(jù)全部緩存起來,加快查詢的速度;
(7)對于InnoDB類型的表,其數(shù)據(jù)的物理組織形式是聚簇表。所有的數(shù)據(jù)按照主鍵來組織。數(shù)據(jù)和索引放在一塊,都位于B+數(shù)的葉子節(jié)點上;
當(dāng)然InnoDB的存儲表和索引也有下面兩種形式:
(1)使用共享表空間存儲:所有的表和索引存放在同一個表空間中。
(2)使用多表空間存儲:表結(jié)構(gòu)放在frm文件,數(shù)據(jù)和索引放在IBD文件中。分區(qū)表的話,每個分區(qū)對應(yīng)單獨的IBD文件,分區(qū)表的定義可以查看我的其他文章。使用分區(qū)表的好處在于提升查詢效率。
對于InnoDB來說,最大的特點在于支持事務(wù)。但是這是以損失效率來換取的。
2.MyISAM
MyISAM基于ISAM存儲引擎,并對其進(jìn)行擴展。它是在Web、數(shù)據(jù)倉儲和其他應(yīng)用環(huán)境下最常使用的存儲引擎之一。MyISAM擁有較高的插入、查詢速度,但不支持事務(wù),不支持外鍵。
使用這個存儲引擎,每個MyISAM在磁盤上存儲成三個文件。
(1)frm文件:存儲表的定義數(shù)據(jù)
(2)MYD文件:存放表具體記錄的數(shù)據(jù)
(3)MYI文件:存儲索引
frm和MYI可以存放在不同的目錄下。MYI文件用來存儲索引,但僅保存記錄所在頁的指針,索引的結(jié)構(gòu)是B+樹結(jié)構(gòu)。下面這張圖就是MYI文件保存的機制:
從這張圖可以發(fā)現(xiàn),這個存儲引擎通過MYI的B+樹結(jié)構(gòu)來查找記錄頁,再根據(jù)記錄頁查找記錄。并且支持全文索引、B樹索引和數(shù)據(jù)壓縮。
支持?jǐn)?shù)據(jù)的類型也有三種:
(1)靜態(tài)固定長度表
這種方式的優(yōu)點在于存儲速度非常快,容易發(fā)生緩存,而且表發(fā)生損壞后也容易修復(fù)。缺點是占空間。這也是默認(rèn)的存儲格式。
(2)動態(tài)可變長表
優(yōu)點是節(jié)省空間,但是一旦出錯恢復(fù)起來比較麻煩。
(3)壓縮表
上面說到支持?jǐn)?shù)據(jù)壓縮,說明肯定也支持這個格式。在數(shù)據(jù)文件發(fā)生錯誤時候,可以使用check table工具來檢查,而且還可以使用repair table工具來恢復(fù)。
特點:
插入數(shù)據(jù)快,空間和內(nèi)存使用比較低。如果表主要是用于插入新記錄和讀出記錄,那么選擇MyISAM能實現(xiàn)處理高效率。如果應(yīng)用的完整性、并發(fā)性要求比較低,也可以使用。
3.MEMORY
MEMORY存儲引擎將表中的數(shù)據(jù)存儲到內(nèi)存中,為查詢和引用其他表數(shù)據(jù)提供快速訪問。每一個表實際上都和一個磁盤文件關(guān)聯(lián)。文件是frm。
特點:
(1)支持的數(shù)據(jù)類型有限制,比如:不支持TEXT和BLOB類型,對于字符串類型的數(shù)據(jù),只支持固定長度的行,VARCHAR會被自動存儲為CHAR類型;
(2)支持的鎖粒度為表級鎖。所以,在訪問量比較大時,表級鎖會成為MEMORY存儲引擎的瓶頸;
(3)由于數(shù)據(jù)是存放在內(nèi)存中,一旦服務(wù)器出現(xiàn)故障,數(shù)據(jù)都會丟失;
(4)查詢的時候,如果有用到臨時表,而且臨時表中有BLOB,TEXT類型的字段,那么這個臨時表就會轉(zhuǎn)化為MyISAM類型的表,性能會急劇降低;
(5)默認(rèn)使用hash索引。
(6)如果一個內(nèi)部表很大,會轉(zhuǎn)化為磁盤表。
不同的存儲引擎有不同的特點,我們可以根據(jù)需求來選擇存儲引擎。?還有一個就是數(shù)據(jù)表也是有存儲引擎的,一個數(shù)據(jù)庫里面的數(shù)據(jù)表可以是不同的存儲引擎
創(chuàng)建表時指定存儲引擎的類型:
CREATE TABLE 表名(字段 約束 類型) ENGINE = INNODB
改變現(xiàn)有的表使用的存儲引擎,用以下語句:
ALTER TABLE mytable ENGINE = MyISAM
可以直接使用查看數(shù)據(jù)表創(chuàng)建的語句就能看到當(dāng)前數(shù)據(jù)表使用的存儲引擎:
show create table 表名;
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
總結(jié)
以上是生活随笔為你收集整理的3种mysql的储存机制_MySQL三种InnoDB、MyISAM和MEMORY存储引擎对比的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 1061原因_MySQL死锁
- 下一篇: 很多人是在姚贝娜的身上看到自己的影子,所