MySQL- 存儲引擎

jopen 12年前發布 | 14K 次閱讀 MySQL 數據庫服務器

Mysql邏輯架構視圖

MySQL- 存儲引擎

主要存儲引擎

引擎

Mysql版本 事務 鎖粒度 主要引用 忌用
InnoDB 全部 支持 支持Mvcc行級鎖 事務處理  
MyISAM 全部 不支持 支持并發插入的表鎖 Select,insert高負載 讀寫并重的場合
MyISAM  Merge 全部 不支持 支持并發插入的表鎖 分段歸檔, 許多全局查找
Memory(HEAP) 全部 不支持 表鎖 中間計算,靜態數據查證 大型數據集,持久性存儲,重啟后數據丟失
Falcon 6.0 支持 支持Mvcc行級鎖 事務處理  
Archive 4.1 支持 支持Mvcc行級鎖 日志記錄,聚合分析,只支持insert,select操作 需要隨機讀取 刪除
CSV 4.1 不支持 表鎖 日志記錄,大規模加載外部數據 需要隨機讀取,索引等
NDB Cluster 5.0 支持 行級鎖 高可用集群 典型引用
Maria 6.x 支持 支持mvcc行級鎖 替代MyISAM  

可以通過show table status like '表名稱'\G 來查看表的信息

 鎖粒度 

1.表鎖 (Table Lock)

     當一個用戶對表進行寫操作(新增,刪除,修改), 會獲得一個寫鎖,寫鎖會禁止其他用戶的讀寫操作,當無人做寫操作時,其他用戶才能獲得讀鎖,讀鎖與讀鎖之間不會沖突。表鎖是最小鎖策略,其性能良好,表鎖由Mysql本身 和 存儲引擎實現。

2.行級鎖(Row Lock)

  行級鎖可以支持最大的并發處理,同時也帶來了最大鎖開銷,行級鎖在InnoDB,Falcon存儲引擎出以實現。 行級鎖由存儲引擎實現,而不是Mysql服務器本身。

3.MVCC行級鎖

   MVCC 是一種多版本并發控制(Multiversion Concurrency Control)的技術,MVCC不是mysql獨有的技術,Oracle,PostgreSQL等其他數據庫也使用了該技術。

每種存儲引擎實現MVCC的方式是不同的,例如樂觀并發控制,悲觀并發控制,下面以Innodb的實現方式 說說其簡要工作原理:

Innodb通過為每個數據行增加兩個隱士的字段來實現MVCC,這兩個隱士字段記錄了行的創建的時間,以及過期時間(刪除時間),每一行都存儲了 事件發生時的系統版本號,用來替代事件發生時的實際時間。每一次開啟一個新的事務時,版本號都會遞增,每個事務都會保存它在開始時的“系統版本”的記錄, 而每個查詢都會根據事務的版本號,檢查每行數據的版本號。

SELECT

    Innodb 檢查每行數據,確保它們符合兩個標準

   *Innodb只查找版本號小于或等于當前版本號的數據,這確保了當前事務讀取的數據行都是在事務開始前已存在,或者是當前事務創建或修改的行。

   *數據行的刪除標識必須是未定義,或者是大于事務版本的,這確保了查詢出來的數據在事務開始時是未被刪除的。

INSERT

   Innodb為新增的數據行記錄當前版本號

DELETE

  修改要刪除行的過期時間標識

UPDATE

   為每個需要更新的行建立一個新的行的拷貝,并為新的行拷貝記錄當前系統版本。也為更新前的數行記錄系統版本號,作為舊行的刪除版本標識。保存這些額外記 錄的好處是大多數并發操作都不必申請枷鎖,這使讀操作變得更快,因為讀操作是要選取符合標準的數據行即可,這種方式的缺點是:存儲引擎必須為每行數據存儲 更多的額外數據,浪費空間,做更多的檢查工作,以及整理一些額外的數據帶來的開銷。

加鎖策略 并發 系統開銷 引擎
表級加鎖 最低 最低 MyISAM,Merge,MyISAM  Merge
行級加鎖 NDB Cluster
支持MVCC的行級加鎖 最高 最高 InnoDB,Falcon

選擇合適的引擎

1.事務

    如果應用需要事務處理操作,Innodb仍是最穩定的,如果不需要事務,主要操作是處理一些SELECT和INSERT操作或專用日志記錄,那么MYISAM是一個不錯的選擇。

2.并發

3.備份

4.崩潰后恢復

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!