MySQL 存儲引擎

MySQL數據庫的體系架構以下圖所示:html

從上圖中能夠看出,MySQL主要分爲如下幾個組件:mysql

  • 鏈接池組件
  • 管理服務和工具組件
  • SQL接口組件
  • 分析器組件
  • 優化器組件
  • 緩衝組件
  • 插件式存儲引擎
  • 物理文件 

1、存儲引擎

  存儲引擎 : 其實就是指定 如何存儲數據,如何爲存儲的數據 創建索引 以及 如何更新查詢數據等技術實現的方法。由於在關係數據庫中數據的存儲是以表的形式存儲的,因此存儲引擎也能夠稱爲表類型(即存儲和操做此表的類型)sql

瞭解: 在Oracle 和SQL Server等數據庫中只有一種存儲引擎,全部數據存儲管理機制都是同樣的。而MySql數據庫提供了多種存儲引擎。用戶能夠根據不一樣的需求爲數據表選擇不一樣的存儲引擎,用戶也能夠根據本身的須要編寫本身的存儲引擎數據庫

下表顯示了各類存儲引擎的特性:緩存

MySQL存儲引擎比較
特性 MyISAM InnoDB Memory Archive NDB
存儲限制  沒有   64TB   有  沒有  沒有
事務     支持      支持
鎖粒度  表   行   表  行   頁
B樹索引  支持   支持   支持     支持
哈希索引     支持   支持    
全文索引  支持        
集羣索引     支持      
數據緩存     支持    支持    
索引緩存  支持   支持    支持    
數據壓縮  支持      支持  
批量插入  高  相對低   高  很是高   高
內存消耗  低  高   中  低   低
外鍵支持    支持      
複製支持  支持  支持   支持  支持  支持
查詢緩存  支持  支持   支持  支持  支持
備份恢復  支持  支持   支持  支持  支持
集羣支持          支持

其中最多見的兩種存儲引擎是MyISAM 和 InnoDB安全

 MyISAM存儲引擎

一、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

四、MyISAM也是使用B+tree索引可是和Innodb的在具體實現上有些不一樣。

InnoDB存儲引擎

(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+樹的數據結構中存儲的內容其實是實際數據的地址值。也就是說它的索引和實際數據是分開的,只不過使用索引指向了實際數據。這種索引的模式被稱爲非彙集索引。

    Innodb引擎的索引的數據結構也是B+樹,只不過數據結構中存儲的都是實際的數據,這種索引有被稱爲彙集索引。

 Memory  存儲引擎

Memory存儲引擎(以前稱爲Heap)將表中數據存放在內存中,若是數據庫重啓或崩潰,數據丟失,所以它很是適合存儲臨時數據。

Archive存儲引擎

正如其名稱所示,Archive很是適合存儲歸檔數據,如日誌信息。它只支持INSERT和SELECT操做,其設計的主要目的是提供高速的插入和壓縮功能。

 NDB存儲引擎

NDB存儲引擎是一個集羣存儲引擎,相似於Oracle的RAC,但它是Share Nothing(非共享)的架構,所以能提供更高級別的高可用性和可擴展性。NDB的特色是數據所有放在內存中,所以經過主鍵查找很是快。

關於NDB,有一個問題須要注意,它的鏈接(join)操做是在MySQL數據庫層完成,不是在存儲引擎層完成,這意味着,複雜的join操做須要巨大的網絡開銷,查詢速度會很慢。

 

2、測試存儲引擎

 

建立三個表,分別使用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要好一點.

相關文章
相關標籤/搜索