MySQL體系結構和存儲引擎
定義數據庫和實例
- 數據庫:物理操做系統文件或者其餘形式文件類型的結合。在MYSQL數據庫中,數據庫文件能夠是frm、MYD、MYI、ibd結尾的文件。當使用NDB引擎時,數據庫的文件可能不是操做系統上的文件,而是存放在內存之中的文件,可是定義仍然不變。
- 實例:MYSQL數據庫由後臺線程以及一個共享內存區組成。共享內存能夠被運行的後臺線程所共享。須要牢記的是,數據庫實例纔是真正用於操做數據庫文件的。
MYSQL被設計爲一個單進程多線程架構的數據庫。算法
# 能夠查看當MYSQL數據庫實例啓動時,會在哪些位置查找配置文件。
mysql --help | grep my.cnf
在配置文件中有一個參數是datadir,改參數指定了數據庫所在的路徑。在LINUX操做系統下默認是/user/local/mysql/data
,這個默認路徑只是一個連接,實際指向/opt/mysql_data
。因此用戶必須保證/opt/mysql_data
的用戶和權限sql
MYSQL體系結構
MYSQL由一下幾部分組成:數據庫
- 鏈接池組件
- 管理服務和工具組件
- SQL接口組件
- 查詢分析器組件
- 優化器組件
- 緩衝組件
- 插件式儲存引擎
- 物理文件
須要特別注意的是:存儲引擎是基於表的,而不是數據庫。安全
MYSQL存儲引擎
存儲引擎是MYSQL區別與其餘數據庫的一個最重要特性。用戶能夠根據MYSQL預約的存儲引擎接口編寫本身的存儲引擎。若用戶對某一種存儲引擎的性能或功能不滿意。能夠經過修改源碼來獲得想要的特性,這就是開源帶給咱們的方便與力量。服務器
InnoDB存儲引擎
- 支持事務:主要面向在線事務處理(OLTP)應用。特色是
- 行鎖設計
- 支持外鍵
- 支持相似於Oracle的非鎖定讀,即默認讀取操做不會產生鎖。
- 數據放在一個邏輯的表空間,這個表空間像黑盒同樣由INNODB存儲引擎自身進行管理。它能夠將每一個INNODB存儲引擎的表單獨存放到一個獨立的ibd文件中。
- 經過使用多版本併發控制(MVCC)來得到高併發性
- 實現了SQL標準的四種隔離級別。默認爲REPEATABLE級別。使用一種被稱爲next-keylocking的策略來避免幻讀現象的產生。
- 提供插入緩衝、二次寫、自適應哈希索引、預讀等高性能和高可用功能。
- 表中數據採用彙集的方式存放,所以每場表的儲存都是按主鍵的順序進行存放,若是沒有顯式指定主鍵,則會爲每一行生成一個6字節的ROWID,並做爲主鍵。
MyISAM存儲引擎
- 不支持事務,支持全文索引,主要面向一些OLAP數據庫應用。
- 緩衝池只緩衝索引文件,不緩衝數據文件。
- MYD用來存放數據文件,MYI用來存放索引文件。
NDB存儲引擎
- 集羣架構:share nothing
- 數據所有放在內存中,所以主鍵查找的速度極快,而且經過添加NDB數據存儲節點能夠線性地提升數據庫性能,是高可用、高性能的集羣系統。
- NDB存儲引擎的鏈接操做是在MYSQL數據庫層完成的,而是在存儲引擎層完成的。這意味着,複雜的鏈接操做須要巨大的網絡開銷
Memory存儲引擎
- 數據都存放在內存中,很是適合用於存儲臨時數據的臨時表,以及數據倉庫中的維度表。
- 默認使用哈希索引
- 只支持表鎖,併發性能較差,不支持TEXT和BLOB列類型
- 存儲變長字段(varchar)時按照定常字段(char)的方式進行的,會浪費內存。
Archive存儲引擎
- 只支持INSERT和SELECT操做
- 支持索引
- 使用zlib算法將數據行進行壓縮後存儲,壓縮比通常達1:10
- 適合存儲歸檔數據,例如日誌信息等。
- 使用行鎖實現高併發的插入操做
- 不支持事務
FEDERATED存儲引擎
- 不存放數據,只是指向一臺遠程MYSQL數據庫服務器上的表。這很是相似於SQL SERVER的聯結服務器和Oracle的透明網關
- 不支持異構
Maria存儲引擎
- 支持魂村數據和索引文件
- 行鎖設計,提供了MVCC功能
- 支持事務和非事務安全的選項
- 更好的BLOB字符類型的處理性能。
# 查看數據庫鎖支持的存儲引擎
SHOW ENGINES\G