博客園已開通有一段時間,一直有想寫博客的想法,但苦於文筆及沒有系統的知識分享,第一篇博客一直拖到如今。數據庫
開發人員對數據庫必定不陌生,可是如今的各類ORM框架使得咱們不太關注數據庫方面的知識儲備。今天我就從數據庫原理來分享最近學到的一些知識。緩存
博客除分享所學外,更重要的是給本身知識的鞏固。若是有不對的地方還請指正,拍磚。網絡
一、引言
MySQL 數據庫獨有的插件式體系結構,存儲引擎是MySQL區別於其餘數據庫的一個最重要特性。存儲引擎的好處是,每一個存儲引擎都有各自的特色,能夠根據具體的應用創建不一樣存儲引擎表。架構
因爲 MySQL 數據庫開源特性,存儲引擎能夠分爲2類:
第一類:MySQL 官方存儲引擎
第二類:第三方存儲引擎 如:InnoDB
二、各存儲引擎介紹
2.1 InnoDB 存儲引擎
InnoDB 存儲引擎支持事務,設計主要面向在線事務處理 (OLTP) 的應用。特色是 行鎖設計、支持外鍵、並支持相似於 Oracle 的非鎖定讀,默認讀取操做不會產生鎖。從 MySQL 數據庫 5.5.8 版本開始,InnoDB 存儲引擎是的存儲引擎。
InnoDB 存儲引擎將數據放在一個邏輯的表空間中,這個表空間就像黑盒同樣由 InnoDB 存儲引擎自身管理。能夠將每一個 InnoDB 存儲引擎的表單獨放到一個獨立的 idb 文件中。
InnoDB 經過使用多版本併發控制 (MVCC) 來得到高併發性,而且實現了 SQL 標準的4種隔離級別,黑夜爲 REPEATABLE 級別。 InnoDB 存儲引擎還提供了插入緩衝 、二次寫、自適應哈希索引、預讀等高性能和高可用功能
對於表中數據的存儲,InnoDB 存儲引擎採用了聚焦 (clustered) 的方式,所以每張表的存儲都是按主鍵的順序進行存放。若是沒有顯示地在表定義時指定主鍵, InnoDB 存儲引擎會爲每一行生成一個 6 字節的 ROWID, 並以此做爲主鍵。
2.2 MyISAM 存儲引擎
MyISAM 存儲引擎不支持事務、表鎖設計,支持全文索引,主要面向一些 OLAP 數據庫應用。數據庫系統與文件系統很大的一個不一樣之處在於對事務的支持,然而MyISAM 存儲引擎是不支持事務的。
MyISAM 存儲引擎的另外一個不一樣地方是它的緩衝池只緩存 (cache) 索引文件,而不緩衝數據文件,這點與大多數的數據庫都不一樣
MyISAM 存儲引擎表由 MYD 和 MYI 組成,MYD 用來存放數據文件, MYI 用來存放索引文件。能夠經過使用 myisampack 工具來進一步壓縮數據,所以使用 myisampack 工具壓縮後的表是隻讀的,也能夠用 myisampack 來解壓數據文件。
在 MySQL 5.0 版本以前, MyISAM 默認支持的表大小爲 4GB,若是須要支持大於4G,須要制定 MAX_ROWS 和 AVG_ROW_LENGTH屬性。從5.0版本開始,默認支持256TB的單表數據。
2.3 NDB 存儲引擎
NDB 存儲引擎是一個集羣存儲引擎,相似於 Oracle 的RAC集羣,與之不一樣的是,其結構是 share nothing 的集羣架構,所以能提供更高的可用性。
特色:a. 數據所有放在內存中,所以主鍵查找速度極快,而且經過加NDB 數據存儲節點能夠線性地提升數據庫性能,是高可用、高性能的集羣系統。
注意:NDB 存儲引擎的鏈接操做 (JOIN) 是在 MySQL 數據庫層完成的, 不是在存儲引擎層完成。意味着複雜的鏈接操做須要巨大的網絡開銷,所以查詢速度很慢。
其餘存儲引擎這裏就不一一介紹,有興趣的童鞋能夠經過 MySQL 技術內幕 中瞭解
總結:每種存儲引擎的實現都不相同,MYSQL 數據的設計思想和存儲引擎的關係須要數據庫設計者權衡。
查看當前MYSQL 數據庫所支持的存儲引擎命令: show engings