MySQL技術內幕讀書筆記(一)——Mysql體系結構和存儲引擎

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
相關文章
相關標籤/搜索