mysql 高性能引擎_《高性能MySQL》笔记1-MySQL架构与引擎
## 架構

> MySQL架構圖
MySQL的架構分為三層。
第一層只負責提供服務,包括鏈接處理、授權認證、安全等,做一些必要的檢查、適配工作,類似Web應用的Controller層。
第二層包含了大多數MySQL的核心功能,包含查詢解析、分析、優化、緩存等,以及一些跨存儲引擎的功能,類似Web應用的Service層。
第三層包含多種存儲引擎,每種引擎有自身的特性,但最終提供統一的底層API與上層通信,屏蔽了底層存儲引擎的差異,類似Web應用的Dao層。
總體來說MySQL的架構與Web應用非常類似,高內聚低耦合。
## 鎖
MySQL的鎖大致分為兩種:
- 讀鎖:共享鎖
在沒有寫鎖時允許同時有多個線程并發讀取,讀鎖優先級低
- 寫鎖:排它鎖
寫鎖阻塞其他的讀鎖與寫鎖,寫鎖優先級高
讀寫鎖有優先級先后之分,猜測MySQL鎖的機制與Java中ReentrantReadWriteLock(true)即公平版讀寫鎖類似:
- 加鎖操作先排隊
- 如果是讀鎖請求且排在隊首,且當前沒有寫鎖線程(排它鎖未被其他線程占用),就可以加共享鎖
- 如果是寫鎖請求在隊首,當前共享鎖未釋放,就不可以加排它鎖
- 寫鎖請求優先級高,可以插隊
## 多版本并發控制 MVCC
加鎖畢竟是一個開銷大的操作,使用MVCC可以盡量避免加鎖,提高并發程度。
### InnoDB的簡化版MVCC行為
InnoDB的MVCC通過事務版本號控制來實現。
InnoDB每行數據有兩個隱藏列:創建版本號和過期版本號。
系統有個版本號,會在每個事務開始時自增,事務版本號就使用此時的系統版本號,事務只允許查詢小于等于自身版本號的數據行。
隔離級別在RR可重復讀的情況下InnoDB的MVCC行為:
**SELECT**
返回數據范圍:
1. 創建版本小于等于本事務版本的
意味著是事務開始前或本事務創建的
2. 沒有刪除版本號,或者刪除版本號大于本事務版本號
意味著未被刪除,或是事務開始后刪除的
**INSERT**
數據行使用當前事務版本號作為創建版本號
**僅僅這樣會導致幻讀,InnoDB使用間隙鎖(next-key locking)來防止幻讀**
**DELETE**
數據行使用當前系統版本號作為過期版本號
**UPDATE**
1. 插入新行,創建版本為當前事務版本
2. 原來的行,過期版本修改為當前事務版本
## 引擎
MySQL應用最廣泛的引擎是InnoDB引擎,除此之外需要深入了解的引擎是MyISAM引擎,MyISAM與InnoDB應用場景有較大不同,且各有鮮明特點。
### InnoDB引擎
MySQL默認引擎,可以說是萬金油型,如果沒有特別的理由或是不知道應該用什么引擎時,就**應該用InnoDB引擎**。
**InnoDB的特點**
1. 性能非常好
2. 支持事務
3. 使用MVCC支持高并發
4. 使用聚簇索引,主鍵查詢性能高
5. 支持行鎖
6. 支持熱備份
7. 自動崩潰恢復
8. 很多自適應優化
9. 索引占用大
InnoDB性能高、支持事務、鎖粒度小等因素使得其適合應用于各種需求,除非用到某些InnoDB不具備的特性且沒有其他辦法替代,否則應該**優先考慮使用InnoDB引擎**。
### MyISAM引擎
MyISAM在某些方面可以被視為與InnoDB“異化競爭”的引擎,通常情況下如果不適合使用InnoDB引擎,應該考慮MyISAM引擎。
**MyISAM的特點**
1. 提供全文索引
2. 不支持事務
3. 不支持行鎖,使用表鎖
4. 支持并發插入,即其他線程對表加了讀鎖,也可以向其中插入記錄
5. 占用空間小
6. 支持數據壓縮
7. 支持寫入緩存,批量刷盤
8. 支持地理空間函數,支持地理空間搜索
MyISAM相對于InnoDB引擎具有優勢的部分在于數據占用空間小,插入速度快、開銷低,可以壓縮數據。
但是這些優勢卻犧牲了許多目前大多數應用場景中必不可少的點,也就是InnoDB那些特點,所以**應該優先考慮InnoDB**。
## 參考資料
[第一章、MySQL架構及歷史 - 簡書](https://www.jianshu.com/p/1f17a496f14e)
總結
以上是生活随笔為你收集整理的mysql 高性能引擎_《高性能MySQL》笔记1-MySQL架构与引擎的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dede mysql x_认识Dede的
- 下一篇: linux cmake编译源码,linu