MySQL存儲引擎簡要介紹

插件式存儲引擎是MySQL的核心。MySQL每個存儲引擎都有各自的特點,能夠根據具體的應用建立不同的存儲引擎表。以下將簡要介紹InnoDB、MySQL、NDB、Memory、Archive、MyISAM Merge這6中存儲引擎。
1、InnoDB
InnoDB作爲第三方存儲引擎,其應用極其廣泛,甚至是MySQL數據庫在OLTP應用中使用最廣泛的。其特點是:行鎖設計、支持外鍵、並支持類似Oracle的非鎖定讀(即默認情況下讀取操作不會產生鎖)。
這裏簡要描述一下OLTP和OLAP應用的區別,OLTP爲聯機事務處理(Online Transaction Processing),是傳統關係型數據庫的主要應用,主要是基本的、日常的事務處理;OLAP爲聯機分析處理(Online Analytical Processing),是數據倉庫的核心部分,支持複雜的分析操作,側重決策支持。
MySQL在windows版本下的默認存儲引擎是InnoDB,同時InnoDB默認地被包含在所有的MySQL二進制發佈版中。
具體而言,InnoDB具有以下特點:
(1)將數據放在一個邏輯的表空間,像黑盒一樣由InnoDB自身進行管理。
(2)使用多版本併發控制MVCC來獲得高併發性。(Multi-Version Concurrency Control 多版本併發控制,參考:http://www.cnblogs.com/perfectdesign/archive/2009/12/05/1617508.htmlhttp://blog.csdn.net/chen77716/article/details/6742128)
(3)實現了SQL標準的4種隔離級別(Isolation Level,參考:http://xm-king.iteye.com/blog/770721)。
3種現象:讀髒數據Dirty Read、不可重複讀Nonrepeatable Read、幻讀Phantom Read
4種隔離級別:讀未提交Read uncommitted、讀已提交Read committed(select只能看到執行前這一瞬間前提交的修改)、可重複讀Read repeatable(在開始事務時,給數據庫拍個快照,然後該事務所有的操作都在這個快照上進行)、可串行化Serializable(利用next-key locking策略實現)
(4)插入緩存、二次寫、自適應哈希索引、預讀等
(5)聚集Clustered,每張表的存儲都按照主鍵的順序存放,如果沒有顯式地在表定義時指定主鍵,InnoDB會爲每一行生成一個6字節的ROWID,並依次作爲主鍵
2、MyISAM
MyISAM是MySQL除windows版本外,所有MySQL版本默認的存儲引擎。其特點是:不支持事務,表鎖和全文索引。其根據數據表的特性可分爲:
(1)靜態MySQL:各數據列的長度都預先固定好。因爲表中每一條記錄所佔空間都一樣->存取和更新效率更高,數據受損時恢復較易。
(2)動態MySQL:數據表中出現varchar、xxxtext或xxxblob字段時。這種表存儲空間比較小,但由於每條記錄的長度不一,所以 多次修改數據後,數據表中的數據就可能離散的存儲在內存中,進而導致執行效率下降,且內存中也可能會出現很多碎片->經常用optimize table命令或優化工具來進行碎片整理。
(3)壓縮MySQL:用myisamchk工具壓縮,進一步減小了佔用的存儲->壓縮之後不能修改,且表讀取時先進行解壓。
MyISAM存儲引擎表:myd存放數據文件;myi存放索引文件。MySQL數據庫只緩存其索引文件,數據文件的緩存由操作系統本身完成,這與Oracle不同(Oracle使用LRU即least recently used最近最少使用算法緩存數據)
3、NDB
NDB是一個集羣存儲引擎,採用Share noting集羣架構。其特點是:數據全部放在內存中(5.1以上版本可將非索引數據放在磁盤上)->主鍵查找極快(primary key lookup);通過添加NDB數據的存儲節點DataNode可線性提高數據庫性能。
注:NDB存儲引擎的連接操作JOIN是在MySQL數據庫層完成的,而非存儲引擎層。

下面我們將分別描述Share disk、Share Memory和Share nothing的區別(參考:http://blog.sina.com.cn/s/blog_7646b7a70100wjwg.html 或 http://tech.it168.com/a2012/0306/1321/000001321022_all.shtml)。


Share disk:每個CPU使用自己的私有內存區域,通過內部通訊機制(Interconnection Network)直接訪問所有磁盤。磁盤系統由Interconnection Network連接在一起。
Share Memory:多個CPU共享同一片內存,CPU之間通過內部通訊機制(Interconnection Network)通訊。CPU之間通過主存進行通訊,具有很高的效率;但當更多的CPU被添加到主機上時,內存競爭contetion就成爲瓶頸,CPU越多,瓶頸越厲害。
Share disk和Share Memory基本問題:Interference。當添加更多的CPU,系統反而減慢,因爲增加了對內存訪問Memory access和網絡帶寬network bandwidth的競爭。
Share nothing:每個CPU有自己的私有內存區域和磁盤空間,而且2個CPU不能訪問相同磁盤空間,CPU之間的通訊採用網絡連接->降低了競爭資源的等待時間,從而提高了性能。
Oracle的RAC->採用共享存儲機制,對於I/O密集型的應用,瓶頸很容易落在存儲上,這樣的機制決定後續擴展只能是Scale Up想上擴展。
Sharding分片(Share Nothing架構)->是具體技術細節之上的抽象處理,是水平擴展的解決方案,其主要目的是爲突破單點數據庫服務器的I/O能力限制,解決數據庫擴展性問題。應用場景:抽象出來的數據對象之間關聯數據很小,如聯機遊戲、IM、BSP(Blog service provider)。(參考:http://dbanotes.net/database/database_sharding-2.html)
縱向擴展(Scale Up),即買更好的機器添加更多的資源來取得更好的性能(如硬件升級、更快更多的CPU、更大的內存、更多更大的磁盤等),而形式上採用的是並行數據庫、分佈式數據庫的模式,具體細節依賴水平分區或者垂直分區的技術。
橫向擴展(Scale Out),這種方式採用一些Ad-hoc的技術,比如說對數據庫進行主從配置(Master-Slave)、採用數據庫複製(Replication)技術以及服務器的緩存(Server Cache)等,來將負載分佈到多個物理節點上去。

Sharding vs. Partition


Sharding分片->可跨越DB,跨越物理機器。
Partition分區->可跨越表空間,不同的物理屬性,不可跨越DB。
集羣的兩大能力:
(1)負載均衡,包括讀寫負載均衡和讀負載均衡。
(2)錯誤恢復:由於一個實體中的資源不能工作,另一實體中的資源透明的繼續完成任務。
集羣 vs. 分佈式
集羣->將幾臺服務器集中在一起,實現同一業務。例如Hadoop中的Map/Reduce
分佈式->將不同業務分佈在不同的地方。
4、Memory(Heap)
Memory將表中的數據存放在內存中,如果數據庫重啓或發生崩潰,表中的數據將消失->適用於臨時數據的臨時表及數據倉庫中的緯度表,默認使用哈希索引。
限制:只支持表鎖,併發性能差,並且不支持xxxtext和xxxblob列類型;存儲變長字段varchar時是按照常字段char的方式進行->浪費內存。
MySQL數據庫使用Memory存儲引擎作爲臨時表來存放查詢結果的中間集,如果中間結果集大於Memory存儲引擎的容量設置,或中間集中包含xxxtext或xxxblob列類型字段,MySQL數據庫會把其轉換到MyISAM存儲引擎。
5、Archive
Archive只支持insert和select操作(5.1以上開始支持索引),使用zlib算法將數據行壓縮後存儲(壓縮率一般可達1:10)->適合歸檔數據,例如日誌記錄和聚合分析。
設計目標:提供高速的插入和壓縮功能。
6、MyISAM Merge
MyISAM Merge是MyISAM的一個變種,合併表是將借個相同的MyISAM表合併成爲一個虛表->常用於日誌記錄和數據倉庫。

幾種常用的MySQL存儲引擎對比


幾個問題:
(1)MySQL不支持全文索引?

不對,MySQL支持->MyISAM、Sphinx存儲引擎支持
(2)MySQL不支持事務?
不對,MySQL支持->innodb支持
(3)表的數據量大於1000W時,MySQL性能會急劇下降?

不對,MySQL是數據庫,不是文件,隨着數據行數增加,性能當然會下降,但不是線性的->選擇合適的存儲引擎及正確的配置,再大的數據量MySQL也是能承受的。

參考:<MySQL技術內幕 InnoDB存儲引擎>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章