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.崩潰後恢復