mysql 高性能引擎_《高性能MySQL》笔记1-MySQL架构与引擎
## 架構(gòu)

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