MySQL數據庫的體系架構以下圖所示:html
從上圖中能夠看出,MySQL主要分爲如下幾個組件:mysql
存儲引擎 : 其實就是指定 表 如何存儲數據,如何爲存儲的數據 創建索引 以及 如何更新,查詢數據等技術實現的方法。由於在關係數據庫中數據的存儲是以表的形式存儲的,因此存儲引擎也能夠稱爲表類型(即存儲和操做此表的類型)sql
瞭解: 在Oracle 和SQL Server等數據庫中只有一種存儲引擎,全部數據存儲管理機制都是同樣的。而MySql數據庫提供了多種存儲引擎。用戶能夠根據不一樣的需求爲數據表選擇不一樣的存儲引擎,用戶也能夠根據本身的須要編寫本身的存儲引擎數據庫
下表顯示了各類存儲引擎的特性:緩存
特性 | MyISAM | InnoDB | Memory | Archive | NDB |
---|---|---|---|---|---|
存儲限制 | 沒有 | 64TB | 有 | 沒有 | 沒有 |
事務 | 支持 | 支持 | |||
鎖粒度 | 表 | 行 | 表 | 行 | 頁 |
B樹索引 | 支持 | 支持 | 支持 | 支持 | |
哈希索引 | 支持 | 支持 | |||
全文索引 | 支持 | ||||
集羣索引 | 支持 | ||||
數據緩存 | 支持 | 支持 | |||
索引緩存 | 支持 | 支持 | 支持 | ||
數據壓縮 | 支持 | 支持 | |||
批量插入 | 高 | 相對低 | 高 | 很是高 | 高 |
內存消耗 | 低 | 高 | 中 | 低 | 低 |
外鍵支持 | 支持 | ||||
複製支持 | 支持 | 支持 | 支持 | 支持 | 支持 |
查詢緩存 | 支持 | 支持 | 支持 | 支持 | 支持 |
備份恢復 | 支持 | 支持 | 支持 | 支持 | 支持 |
集羣支持 | 支持 |
其中最多見的兩種存儲引擎是MyISAM 和 InnoDB安全
一、MyISAM 是MySQL (mysql 5.5版本之前) 原來的默認存儲引擎.網絡
二、MyISAM 這種存儲引擎不支持事務,不支持行級鎖,只支持併發插入的表鎖。數據結構
三、MyISAM 類型的表支持三種不一樣的存儲結構:靜態型、動態型、壓縮型。架構
(1)靜態型:就是定義的表列的大小是固定(即不含有:xblob、xtext、varchar等長度可變的數據類型),這樣mysql就會自動使用靜態myisam格式。併發
使用靜態格式的表的性能比較高,由於在維護和訪問的時候以預約格式存儲數據時須要的開銷很低。可是這高性能是用空間換來的,由於在定義的時候是固定的,因此無論列中的值有多大,都會以最大值爲準,佔據了整個空間。
(2)動態型:若是列(即便只有一列)定義爲動態的(xblob, xtext, varchar等數據類型),這時myisam就自動使用動態型,雖然動態型的表佔用了比靜態型表較少的空間,但帶來了性能的下降.
(3)壓縮型:若是在這個數據庫中建立的是在整個生命週期內只讀的表,則這種狀況就是用myisam的壓縮型表來減小空間的佔用。
壓縮方式參考官方文檔: https://dev.mysql.com/doc/refman/5.6/en/myisampack.html
(1)MySQL默認存儲引擎(MySQL 5.5 版本後).
(2)innodb 支持事務,回滾以及系統崩潰修復能力和多版本迸發控制的事務的安全。
(3)innodb 支持自增加列(auto_increment),自增加列的值不能爲空,(一個表只容許存在一個自增,而且要求自增列必須爲索引)
(4)innodb 支持外鍵(foreign key) ,外鍵所在的表稱爲子表,而所依賴的表稱爲父表。
(5)innodb存儲引擎支持行級鎖。
(6)innodb存儲引擎索引使用的是B+Tree
補充3點:
1.大容量的數據集時趨向於選擇Innodb。由於它支持事務處理和故障的恢復。Innodb能夠利用數據日誌來進行數據的恢復。主鍵的查詢在Innodb也是比較快的。
2.大批量的插入語句時(這裏是INSERT語句)在MyIASM引擎中執行的比較的快,可是UPDATE語句在Innodb下執行的會比較的快,尤爲是在併發量大的時候。
3.兩種引擎所使用的索引數據結構是什麼?
答案:都是B+樹!
MyIASM引擎,B+樹的數據結構中存儲的內容其實是實際數據的地址值。也就是說它的索引和實際數據是分開的,只不過使用索引指向了實際數據。這種索引的模式被稱爲非彙集索引。
正如其名稱所示,Archive很是適合存儲歸檔數據,如日誌信息。它只支持INSERT和SELECT操做,其設計的主要目的是提供高速的插入和壓縮功能。
NDB存儲引擎是一個集羣存儲引擎,相似於Oracle的RAC,但它是Share Nothing(非共享)的架構,所以能提供更高級別的高可用性和可擴展性。NDB的特色是數據所有放在內存中,所以經過主鍵查找很是快。
關於NDB,有一個問題須要注意,它的鏈接(join)操做是在MySQL數據庫層完成,不是在存儲引擎層完成,這意味着,複雜的join操做須要巨大的網絡開銷,查詢速度會很慢。
建立三個表,分別使用innodb,myisam,memory 存儲引擎,進行插入數據測試
create table t1(id int)engine=innodb;
create table t2(id int)engine=myisam;
create table t3(id int)engine=memory;
#看一下三個存儲引擎建立的 表文件
t1.frm t1.ibd
t2.MYD t2.MYI t2.frm
t3.frm
#細心的會發現最後的存儲引擎只有表結構,無數據
#memory,在重啓mysql或者重啓機器後,表內數據清空
innodb與MyIASM存儲引擎的區別:
1.innodb 是mysql5.5版本之後的默認存儲引擎, 而MyISAM是5.5版本之前的默認存儲引擎.
2.innodb 支持事物,而MyISAM不支持事物
3.innodb 支持行級鎖.而MyIASM 它支持的是併發的表級鎖.
4.innodb 支持外鍵, 而MyIASM 不支持外鍵
5.innodb與MyIASM存儲引擎都採用B+TREE存儲數據, 可是innodb的索引與數據存儲在一個文件中,這種方式咱們稱之爲聚合索引.
而MyIASM則會單首創建一個索引文件,也就是說,數據與索引是分離開的
6.在效率方面MyISAM比innodb高,可是在性能方面innodb要好一點.