MySQL 存储引擎
MySQL數(shù)據(jù)庫的體系架構(gòu)如下圖所示:
從上圖中可以看出,MySQL主要分為以下幾個組件:
- 連接池組件
- 管理服務和工具組件
- SQL接口組件
- 分析器組件
- 優(yōu)化器組件
- 緩沖組件
- 插件式存儲引擎
- 物理文件?
一、存儲引擎
存儲引擎?: 其實就是指定?表?如何存儲數(shù)據(jù),如何為存儲的數(shù)據(jù)?建立索引?以及?如何更新,查詢數(shù)據(jù)等技術(shù)實現(xiàn)的方法。因為在關(guān)系數(shù)據(jù)庫中數(shù)據(jù)的存儲是以表的形式存儲的,所以存儲引擎也可以稱為表類型(即存儲和操作此表的類型)
了解:?在Oracle 和SQL Server等數(shù)據(jù)庫中只有一種存儲引擎,所有數(shù)據(jù)存儲管理機制都是一樣的。而MySql數(shù)據(jù)庫提供了多種存儲引擎。用戶可以根據(jù)不同的需求為數(shù)據(jù)表選擇不同的存儲引擎,用戶也可以根據(jù)自己的需要編寫自己的存儲引擎
下表顯示了各種存儲引擎的特性:
| 存儲限制 | ?沒有 | ? 64TB | ? 有 | ?沒有 | ?沒有 |
| 事務 | ? | ? 支持 | ? | ? | ?支持 |
| 鎖粒度 | ?表 | ? 行 | ? 表 | ?行 | ? 頁 |
| B樹索引 | ?支持 | ??支持 | ??支持 | ? | ??支持 |
| 哈希索引 | ? | ??支持 | ??支持 | ? | ? |
| 全文索引 | ?支持 | ? | ? | ? | ? |
| 集群索引 | ? | ??支持 | ? | ? | ? |
| 數(shù)據(jù)緩存 | ? | ??支持 | ? ?支持 | ? | ? |
| 索引緩存 | ?支持 | ??支持 | ? ?支持 | ? | ? |
| 數(shù)據(jù)壓縮 | ?支持 | ? | ? | ?支持 | ? |
| 批量插入 | ?高 | ?相對低 | ??高 | ?非常高 | ??高 |
| 內(nèi)存消耗 | ?低 | ?高 | ? 中 | ?低 | ? 低 |
| 外鍵支持 | ? | ?支持 | ? | ? | ? |
| 復制支持 | ?支持 | ?支持 | ??支持 | ?支持 | ?支持 |
| 查詢緩存 | ?支持 | ?支持 | ??支持 | ?支持 | ?支持 |
| 備份恢復 | ?支持 | ?支持 | ??支持 | ?支持 | ?支持 |
| 集群支持 | ? | ? | ? | ? | ?支持 |
其中最常見的兩種存儲引擎是MyISAM 和 InnoDB
?MyISAM存儲引擎
1、MyISAM 是MySQL (mysql 5.5版本以前) 原來的默認存儲引擎.
2、MyISAM?? 這種存儲引擎不支持事務,不支持行級鎖,只支持并發(fā)插入的表鎖。
3、MyISAM???類型的表支持三種不同的存儲結(jié)構(gòu):靜態(tài)型、動態(tài)型、壓縮型。
(1)靜態(tài)型:就是定義的表列的大小是固定(即不含有:xblob、xtext、varchar等長度可變的數(shù)據(jù)類型),這樣mysql就會自動使用靜態(tài)myisam格式。
??????? 使用靜態(tài)格式的表的性能比較高,因為在維護和訪問的時候以預定格式存儲數(shù)據(jù)時需要的開銷很低。但是這高性能是用空間換來的,因為在定義的時候是固定的,所以不管列中的值有多大,都會以最大值為準,占據(jù)了整個空間。
(2)動態(tài)型:如果列(即使只有一列)定義為動態(tài)的(xblob, xtext, varchar等數(shù)據(jù)類型),這時myisam就自動使用動態(tài)型,雖然動態(tài)型的表占用了比靜態(tài)型表較少的空間,但帶來了性能的降低.
(3)壓縮型:如果在這個數(shù)據(jù)庫中創(chuàng)建的是在整個生命周期內(nèi)只讀的表,則這種情況就是用myisam的壓縮型表來減少空間的占用。
壓縮方式參考官方文檔: https://dev.mysql.com/doc/refman/5.6/en/myisampack.html
4、MyISAM也是使用B+tree索引但是和Innodb的在具體實現(xiàn)上有些不同。
InnoDB存儲引擎
(1)MySQL默認存儲引擎(MySQL 5.5 版本后).
(2)innodb 支持事務,回滾以及系統(tǒng)崩潰修復能力和多版本迸發(fā)控制的事務的安全。
(3)innodb 支持自增長列(auto_increment),自增長列的值不能為空,(一個表只允許存在一個自增,并且要求自增列必須為索引)
(4)innodb 支持外鍵(foreign key) ,外鍵所在的表稱為子表,而所依賴的表稱為父表。
(5)innodb存儲引擎支持行級鎖。
(6)innodb存儲引擎索引使用的是B+Tree
補充3點:
? ? 1.大容量的數(shù)據(jù)集時趨向于選擇Innodb。因為它支持事務處理和故障的恢復。Innodb可以利用數(shù)據(jù)日志來進行數(shù)據(jù)的恢復。主鍵的查詢在Innodb也是比較快的。
? ? 2.大批量的插入語句時(這里是INSERT語句)在MyIASM引擎中執(zhí)行的比較的快,但是UPDATE語句在Innodb下執(zhí)行的會比較的快,尤其是在并發(fā)量大的時候。
? ? 3.兩種引擎所使用的索引數(shù)據(jù)結(jié)構(gòu)是什么?
? ? ? ? 答案:都是B+樹!
MyIASM引擎,B+樹的數(shù)據(jù)結(jié)構(gòu)中存儲的內(nèi)容實際上是實際數(shù)據(jù)的地址值。也就是說它的索引和實際數(shù)據(jù)是分開的,只不過使用索引指向了實際數(shù)據(jù)。這種索引的模式被稱為非聚集索引。
Innodb引擎的索引的數(shù)據(jù)結(jié)構(gòu)也是B+樹,只不過數(shù)據(jù)結(jié)構(gòu)中存儲的都是實際的數(shù)據(jù),這種索引有被稱為聚集索引。
?Memory? 存儲引擎
Memory存儲引擎(之前稱為Heap)將表中數(shù)據(jù)存放在內(nèi)存中,如果數(shù)據(jù)庫重啟或崩潰,數(shù)據(jù)丟失,因此它非常適合存儲臨時數(shù)據(jù)。
Archive存儲引擎
正如其名稱所示,Archive非常適合存儲歸檔數(shù)據(jù),如日志信息。它只支持INSERT和SELECT操作,其設計的主要目的是提供高速的插入和壓縮功能。
?NDB存儲引擎
NDB存儲引擎是一個集群存儲引擎,類似于Oracle的RAC,但它是Share Nothing(非共享)的架構(gòu),因此能提供更高級別的高可用性和可擴展性。NDB的特點是數(shù)據(jù)全部放在內(nèi)存中,因此通過主鍵查找非常快。
關(guān)于NDB,有一個問題需要注意,它的連接(join)操作是在MySQL數(shù)據(jù)庫層完成,不是在存儲引擎層完成,這意味著,復雜的join操作需要巨大的網(wǎng)絡開銷,查詢速度會很慢。
?
二、測試存儲引擎
?創(chuàng)建三個表,分別使用innodb,myisam,memory 存儲引擎,進行插入數(shù)據(jù)測試
| 1 2 3 4 5 6 7 8 9 10 | create?table?t1(id?int)engine=innodb; create?table?t2(id?int)engine=myisam; create?table?t3(id?int)engine=memory; #看一下三個存儲引擎創(chuàng)建的 表文件 ?t1.frm? t1.ibd? ?t2.MYD? t2.MYI? t2.frm? ?t3.frm #細心的同學會發(fā)現(xiàn)最后的存儲引擎只有表結(jié)構(gòu),無數(shù)據(jù) #memory,在重啟mysql或者重啟機器后,表內(nèi)數(shù)據(jù)清空 |
重點[面試題]:
innodb與MyIASM存儲引擎的區(qū)別:
1.innodb 是mysql5.5版本以后的默認存儲引擎, 而MyISAM是5.5版本以前的默認存儲引擎.
2.innodb 支持事物,而MyISAM不支持事物
3.innodb 支持行級鎖.而MyIASM 它支持的是并發(fā)的表級鎖.
4.innodb 支持外鍵, 而MyIASM 不支持外鍵
5.innodb與MyIASM存儲引擎都采用B+TREE存儲數(shù)據(jù), 但是innodb的索引與數(shù)據(jù)存儲在一個文件中,這種方式我們稱之為聚合索引.?
而MyIASM則會單獨創(chuàng)建一個索引文件,也就是說,數(shù)據(jù)與索引是分離開的
6.在效率方面MyISAM比innodb高,但是在性能方面innodb要好一點.
轉(zhuǎn)載于:https://www.cnblogs.com/qinghuani/p/8619844.html
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的MySQL 存储引擎的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BZOJ.2716.[Violet3]天
- 下一篇: mvc学习