高性能MySQL(1)——MYSQL架構

MySQL最重要、最與眾不同的特性是它的存儲引擎架構,這種架構將查詢處理與數據的存儲/提取相分離,使得可以在使用時根據不同的需求來選擇數據存儲的方式。

一、Mysql邏輯架構

如果能在頭腦中構建出一幅MySQL各組件之間如何協同工作的架構圖,就會有助于深入理解MySQL服務器。

mysql 數據庫的邏輯架構如下圖

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Jx9utej6-1603348859176)(/Users/marron27/Documents/lizhengi/MySQL/高性能MySQL/T.Mysql邏輯圖.png)]

從上圖可以看出My SQL邏輯結構大致可以分為三層:

第一層結構主要處理客戶端與mysql服務端的連接、授權認證、安全等;

第二層是Mysql服務端的核心,功能包括查詢解析、分析、優化、緩存等,所有跨存儲引擎的功能都在這一層實現:存儲過程、觸發器、視圖等都在這一層實現;

第三層的存儲引擎主要負責數據存儲和提取,服務器通過API與存儲引擎進行通信,存儲引擎API包含幾十個底層函數,用于執行諸如“開始一個事務”或者“根據 主鍵提取一行記錄”等操作。但存儲引擎不會去解析sql,不同存儲引擎之間不會通訊,只會簡單地響應上層服務器的請求

1.1、連接管理

每個客戶端連接成功,都會在服務器進程中擁有一個線程,服務器會緩存線程,該線程只能輪流在某個CPU中運行,所以不需要創建和銷毀線程。

1.2、安全性

當客戶端(應用)連接到MySQL服務器時,服務器需要對其進行認證。認證基于用戶名、原始主機信息和密碼等信息。

一旦客戶端連接成功,服務器會繼續驗證該客戶端是否具有執行某個特定查詢的權限

1.3、解析優化查詢

MySQL會解析査詢,并創建內部數據結構(解析樹),然后對其進行各種優化,包括重 寫查詢、決定表的讀取順序,以及選擇合適的索引等。

對于SELECT查詢語句,解析查詢之前會先查詢緩存,如果緩存能找到是不會去解析的,如果緩存查找不到,就會重現解析查詢,創建解析樹,然后對其進行查詢優化、決定表的讀取順序、選擇合適的索引等

二、并發控制

無論何時,只要有多個査詢需要在同一時刻修改數據,都會產生并發控制的問題。

并發即指在同一時刻,多個操作并行執行。MySQL對并發的處理主要應用了兩種機制——是"鎖"和"多版本控制"。

2.1、鎖機制

在處理并發讀或者寫時,可以 通過實現一個由兩種類型的鎖組成的鎖系統來解決問題:

  • 共享鎖:也稱為讀鎖,讀鎖允許多個連接可以同一時刻并發的讀取同一資源,互不干擾;
  • 排他鎖:也稱為寫鎖,一個寫鎖會阻塞其他的寫鎖或讀鎖,保證同一時刻只有一個連接可以寫入數據,同時防止其他用戶對這個數據的讀寫。

2.2、鎖粒度

所謂的鎖策略,就是在鎖的開銷和數據的安全性之間尋求平衡,這種平衡當然也會影響到性能。

MySQL提供兩個級別的并發控制:服務器級(the server level)和存儲引擎級(the storage engine level)。加鎖是實現并發控制的基本方法,MySQL中鎖的粒度:

  • 表級鎖(服務器層):MySQL獨立于存儲引擎提供表鎖,例如,對于ALTER TABLE語句,服務器提供表鎖(table-level lock)。表鎖是最基本也是開銷最小的策略;
  • 行級鎖(引擎層):InnoDB和Falcon存儲引擎提供行級鎖,此外,BDB支持頁級鎖。行級鎖可以最大程度地支持并發處理(同時也帶來了最大的鎖開銷)。

另外,值得一提的是,MySQL的一些存儲引擎(如InnoDB、BDB)除了使用封鎖機制外,還同時結合MVCC機制,即多版本并發控制(Multi-Version Concurrent Control),來實現事務的并發控制,從而使得只讀事務不用等待鎖,提高了事務的并發性。

2.3、多版本并發控制

MVCC的實現:通過保存數據資源在不同時間點的快照實現的。根據事務開始的時間不同,每個事務看到的數據快照版本是不一樣的。

InnoDB中的MVCC實現:通過在每行記錄后面保存兩個隱藏的列來實現,一個保存了行的創建時間,一個保存了行的過期時間。

  • SELECT

    當讀取記錄時,存儲引擎會選取滿足下面兩個條件的行作為讀取結果。

    讀取記錄行的開始版本號必須早于當前事務的版本號。也就是說,在當前事務開始之前,這條記錄已經存在。在事務開始之后才插入的行,事務不會看到。

    讀取記錄行的過期版本號必須晚于當前事務的版本號。也就是說,當前事務開始的時候,這條記錄還沒有過期。在事務開始之前就已經過期的數據行,該事務也不會看到。

  • INSERT

    存儲引擎為新插入的每一行保存當前的系統版本號作為這一行的開始版本號。

  • UPDATE

    存儲引擎會新插入一行記錄,當前的系統版本號就是新記錄行的開始版本號。同時會將原來行的過期版本號設為當前的系統版本號。

  • DELETE

    存儲引擎將刪除的記錄行的過期版本號設置為當前的系統版本號。

MVCC只在 REPEATABLE READ 和 READ COMMITTED 兩個隔離級別下工作。

三、事務

3.1、事務的ACID特性

數據庫的事務處理的原則是保證ACID的正確性。

事務是由一組SQL語句組成的邏輯處理單元,事務具有以下4個屬性:

  • 原子性(Atomicity):事務是一個原子操作單元,其對數據的修改,要么全都執行,要么全都不執行,不可能只執行其中的一部分。(不可分割)
  • 一致性(Consistent):在事務開始和完成時,數據都必須保持一致狀態。這意味著所有相關的數據規則都必須應用于事務的修改,以保持數據的完整性;事務結束時,所有的內部數據結構(如B樹索引或雙向鏈表)也都必須是正確的。(狀態更改一致性)
  • 隔離性(Isolation):數據庫系統提供一定的隔離機制,保證事務在不受外部并發操作影響的“獨立”環境執行。這意味著事務處理過程中的中間狀態對外部是不可見的。(執行過程隔離不可見)
  • 持久性(Durable):事務完成之后,它對于數據的修改是永久性的,即使出現系統故障也能夠保持。(持久生效)

3.2、事務處理帶來的問題

由于事務的并發執行,帶來以下一些著名的問題:

  1. 更新丟失(Lost Update):當兩個或多個事務選擇同一行,然后基于最初選定的值更新該行時,由于每個事務都不知道其他事務的存在,就會發生丟失更新問題--最后的更新覆蓋了由其他事務所做的更新。
  2. 臟讀(Dirty Reads):一個事務正在對一條記錄做修改,在這個事務完成并提交前,這條記錄的數據就處于不一致狀態;這時,另一個事務也來讀取同一條記錄,如果不加控制,第二個事務讀取了這些"臟"數據,并據此做進一步的處理,就會產生未提交的數據依賴關系。這種現象被形象地叫做"臟讀"。
  3. 不可重復讀(Non-Repeatable Reads):一個事務在讀取某些數據后的某個時間,再次讀取以前讀過的數據,卻發現其讀出的數據已經發生了改變、或某些記錄已經被刪除了!這種現象就叫做"不可重復讀"。
  4. 幻讀(Phantom Reads):一個事務按相同的查詢條件重新讀取以前檢索過的數據,卻發現其他事務插入了滿足其查詢條件的新數據,這種現象就稱為"幻讀"。

3.3、Mysql隔離級別

READ UNCOMMITTED :事務可以看到其他事務沒有被提交的數據(臟數據)。
READ COMMITTED :事務可以看到其他事務已經提交的數據。
REPEATABLE READ :保證事務中多次查詢的結果相同(Innodb默認級別),會出現幻讀。
SERIALIZABLE :所有事務順序執行,對所有read操作加鎖。保證一致性。

img

四、總結

MySQL擁有分層的架構。上層是服務器層的服務和査詢執行引擎,下層則是存儲引擎。 雖然有很多不同作用的插件API,但存儲引擎API還是最重要的。如果能理解MySQL 在存儲引擎和服務層之間處理查詢時如何通過API來回交互,就能抓住MySQL的核心 基礎架構的精髓。

參考:

《高性能 MySQL 第三版》

MySQL邏輯架構簡介
mysql的并發控制

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/news/535620.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535620.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535620.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據庫設計中的14個關鍵技巧

1. 原始單據與實體之間的關系  可以是一對一、一對多、多對多的關系。在一般情況下,它們是一對一的關系:即一張原始單據對應且只對應一個實體。在特殊情況下,它們可能是一對多或多對一的關系,即一張原始單證對應多個實體&#xf…

高性能MySQL(2)——Schema與數據類型的優化

良好的邏輯設計和物理設計是高性能的基石,應該根據系統將要執行的查詢語句來設計 schema,這往往需要權衡各種因素。 一、選擇優化的數據類型 MySQL支持的數據類型非常多,選擇正確的數據類型對于獲得高性能至關重要。不管 存儲哪種類型的數據&#xff0c…

用戶權限sudo、suid、sgid以及facl等

su 切換用戶或以指定用戶運行命令。 使用su可以指定運行命令的身份(user/group/uid/gid)。 為了向后兼容,su默認不會改變當前目錄,且僅設置HOME和SHELL這兩個環境變量(若目標用戶非root,則還設置USER和LOGNAME環境變量)。推薦使用--login選項…

MySQL 服務器調優

關于 MySQL 調優 有 3 種方法可以加快 MySQL 服務器的運行速度,效率從低到高依次為: 替換有問題的硬件。 對 MySQL 進程的設置進行調優。 對查詢進行優化。 替換有問題的硬件通常是我們的第一考慮,主要原因是數據庫會占用大量資源。不過這…

通過腳本啟動批量服務

/app/all_start_script/wwyt/此目錄服務如下:apigateway.sh auth.sh config.sh register.sh zipkin.sh /app/all_start_script/other/此目錄服務如下: tomcat.sh wwyt_base.sh wwyt_cache.sh wwyt_flow.sh wwyt_risk_login.sh ww…

高性能MySQL(3)——創建高性能索引

索引對于良好的性能非常關鍵。尤其是當表中的數據量越來越大時,索引對性能的影響愈發重要。 一、索引的類型 在MySQL中,索引是在存儲引擎層而不是服務器層實現的。所以沒用統一的索引標準,不同存儲引擎的索引工作方式并不相同。 1.1、B-Tre…

linux 調優系列

Linux系統內核:修改TCP/IP調優參數 所有的TCP/IP調優參數都位于/proc/sys/net/目錄。例如, 下面是最重要的一些調優參數, 后面是它們的含義: 1. /proc/sys/net/core/rmem_max — 最大的TCP數據接收緩沖。 2. /proc/sys/net/core/wmem_max — 最大的TCP數據發送緩沖。 3.…

java中的構造方法與代碼塊

一、構造方法 1.1、java中的構造方法跟普通方法有很大的區別: 構造方法的方法名跟類名相同構造方法沒有返回值類型,連void也沒有,也不能用return返回值每次創建一個對象,都會調用構造方法,如果沒有寫構造方法,系統會默認加上一個空參的構造,如果已經寫了構造方法,…

bash shell是如何識別特殊符號的

一 、 shell命令解析以及識別通配符 Shell是系統的用戶界面,提供了用戶與內核進行交互操作的一種接口。它接收用戶輸入的命令并把它送入內核去執行 。 實際上Shell是一個命令解釋器,它解釋由用戶輸入的命令并且把它們送到內核。不僅如此,Shell有自己的編程語言用于對命令的編…

linux 調優系列(續)

linux 的各大發行版,都有些不必要的服務被默認開啟了,針對ubuntu,我們 可以采用選擇性關閉的方法加速起動,提高系統性能。 這里我們安裝一個軟件: sudo apt-get install sysv-rc-conf 然后這樣起動: 在這個…

配置文件bashrc與profile的區別

1、當登入系統時候獲得-個shell進程時,其讀取環境設定檔有三步 首先讀入的是全局環境變量設定檔/ete/profile,然后根據其內容讀取額外的設定的文檔,如/etc/profile. d和/ etc/ inputre 然后根據不同使用者帳號,去其家目錄讀取, bash, pr…

高性能MySQL(4)——查詢性能優化

査詢優化、索引優化、庫表結構優化需要齊頭并進,一個不落。 一、為什么查詢速度為變慢 在嘗試編寫快速的查詢之前,需要清楚一點,真正重要是響應時間。如果把查詢看作是一個任務,那么他由一系列子任務組成,每個子任務都會消耗一定的時間。如果…

GooglePerformanceTools--tcmalloc

TCmalloc全稱是Thread-Caching malloc,作者宣稱tcmalloc相對于glibc2.3 malloc(aka ptmalloc2)有6倍的性能提高,tcmalloc的常用場景是用于加速MySQL,不過據Wikipedia的hacker Domas Mituzas說,tcmalloc不僅僅對MySQL起作用&#x…

linux基本命令以及命令常用選項

linux基本命令以及命令常用選項touch 創建文件,改變恩建時間戳,如果直接跟上一個文件,該文件不存在則創建文件-c文件不存在不創建文件,存在則改變文件的時間戳-a只改變文件的訪問時間-m改變文件的修改時間-t時間格式CCYYMMDDhhmm…

Java獲取上一周、上一個月、上一年的時間

SimpleDateFormat format new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”); Calendar c Calendar.getInstance(); 1.過去七天 c.setTime(new Date()); c.add(Calendar.DATE, - 7); Date d c.getTime(); String day format.format(d); System.out.println(“過去七天&#…

遠程網絡安裝RHEL5

一:Linux安裝工作原理 眾所周知,在安裝過程中Linux首先需要一個引導程序來讓安裝光盤啟動,再實行配置與安裝。但目前轉化為遠程網絡安裝那么就需要我們的安裝程序能夠遠程地通過網絡傳送給客戶端。因此在搭建遠程Linux安裝服務器時候首先要值…

sed命令操作

sed 是一種數據流編輯器,它一次處理一行內容,處理時,把當前處理的行存儲在臨時緩沖區(pattern space稱為“模式空間”)中,在內存中處理,完成后把該行發送到屏幕上,清理pattern space中的內容,接著重復剛才的動作,讀入下一行,直到文件處理結束。文件內容并沒有 改變,…

Portainer簡介及部署

一、介紹 Portainer是Docker的圖形化管理工具,提供狀態顯示面板、應用模板快速部署、容器鏡像網絡數據卷的基本操作(包括上傳下載鏡像,創建容器等操作)、事件日志顯示、容器控制臺操作、Swarm集群和服務等集中管理和操作、登錄用…

Nexus搭建Maven私有倉庫

一、使用Docker安裝Nexus 1、查詢當前有哪些Nexus鏡像 docker search nexus2、下載sonatype/nexus3 docker pull docker.io/sonatype/nexus33、運行nexus容器 mkdir -p /usr/local/nexus3/nexus-data #新建掛載目錄 chown -R 200 /usr/local/nexus3/nexus-datadocker run -…

VI資料收集

1.6.1 vi 的工作模式Vi 在初始啟動后首先進入編輯模式,這時用戶可以利用一些預先定義的按鍵來移動光標、刪除文字、復制或粘貼文字等。這些按鍵均是普通的字符,例如 l 是向右移動光標,相當于向右箭頭鍵,k 是向下移動光標&#xff…