1. 程式人生 > >高效能MySQL -MySQL架構,MVCC多版本併發控制和一些基本概念

高效能MySQL -MySQL架構,MVCC多版本併發控制和一些基本概念

內容源於《高效能MySQL》

一、MySQL邏輯架構

架構圖:
這裡寫圖片描述

最上層不是Mysql獨有的, 比如連線處理,授權認證, 安全 等等
第二層核心服務功能,包括查詢解析,分析,優化,快取以及所有內建函式,儲存過程,觸發器,檢視等都在這層實現
第三層 儲存引擎,儲存引擎API包含幾十個底層函式

二、優化與執行
什麼是優化: MySQL解析查詢,並建立內部資料結構(解析樹),然後對其進行各種優化,包括重寫查詢,決定表的讀取順序,以及選擇合適的索引等。 (使用者可以通過特殊的關鍵字提示優化器,影響它的決策過程。也可以請求優化器解釋優化過程的各個因素)

三、併發控制
採用讀寫鎖來進行併發控制,提高併發性的方式就是讓鎖定的物件更有選擇性,只鎖定部分資料,而不是所有的資源,這就是鎖粒度要考慮的問題。

表鎖:MySQL最基本的鎖策略,開銷最小的策略。它會鎖定整張表,使用者對錶進行寫操作前,先獲得寫鎖,這會阻塞其他使用者對該表的所有讀寫操作。只有沒有寫鎖時,其他讀取使用者才能獲得讀鎖,讀鎖之間是不相互阻塞的。

行級鎖:行級鎖可以最大程度地支援併發處理(最大鎖開銷),InnoDB和XtraDB,還有其他一些儲存引擎中實現了行級鎖,行級鎖只在儲存引擎層實現,而MySQL伺服器層沒有實現。

四、事務
事務這個概念比較基礎,就不過多介紹。 記住一句話要麼都做,要麼都不做的。 還有ACID四大特徵:原子性,一致性(從一個一致性的狀態轉換到另一個一致性的狀態),隔離性,永續性。

五、隔離級別
四種隔離級別
1. READ UNCOMMITED(未提交讀)
其他事物可以讀取未提交資料,會導致髒讀(讀髒資料),這種會導致很多問題,一般不採用。
2. READ COMMITED(提交讀)
事務提交之前,所做的任何修改對其他事務不可見,也叫不可重複讀,同一個事務執行兩次相同的查詢,可能得到不一樣的結果。
3. REPEATABLE READ(可重複讀)
保證了在同一個事務中多次讀取同樣記錄的結果是一致的。但無法解決幻讀問題。即當某個事務在讀取範圍內的記錄時,另外一個事務又在該範圍內插入了新紀錄,導致之前的事務再次讀取時,產生幻行。
4. SERIALIZABLE(可序列化)
最高的隔離級別,通過加鎖確保資料的一致性。

看到這裡的時候很容易產生一個困惑,可重複讀和幻讀怎麼感覺沒區別,實際上區別是:
1.可重複讀是指一個事務查詢了資料,另一個事務提交了對這個資料的修改,於是再次讀取資料的時候就出現了重複讀的問題。例如,一個編輯人員兩次讀取同一文件,但在兩次讀取之間,作者重寫了該文件。
2.幻讀則是一個事務修改了資料表,另一個數據插入了一條新資料,導致出現幻行。例如,一個編輯人員更改作者提交的文件,但當生產部門將其更改內容合併到該文件的主複本時,發現作者已將未編輯的新材料新增到該文件中。

六、死鎖
1. 多個事務不同順序鎖定資源時,會產生死鎖,
2. 多個事務同時鎖定同一個資源,產生死鎖。
InnoDB目前處理死鎖的方法是,將持有最小行級排他鎖的事務進行回滾(相對比較簡單的死鎖回滾方法)
越複雜的系統,越能檢測到死鎖的迴圈依賴,並立即返回一個錯誤,否則會導致出現非常慢的查詢。

七、MySQL中的事務
MySQL 提供了兩種事務型的儲存引擎:InnoDB 和 NDB Cluster
MySQL預設採用自動提交模式,即每個查詢都被當做一個事務執行提交操作。另外有一些命令在執行之前會強制執行commit提交,比如ALTER TABLE。

MySQL服務層不管理事務,事務是由下層的儲存引擎實現的,所以同一個事務中,使用多種儲存引擎是不可靠的。

InnoDB採用的是兩階段鎖定協議,事務執行過程中,隨時可以鎖定,鎖只有在執行commit或者rollback的時候才會釋放,並且同一個時刻被釋放。

八、多版本併發控制MVCC
MySQL的大多數事務型儲存引擎都不是簡單的行級鎖。各大資料庫基本都採用MVCC,但不盡相同。

InnoDB的簡化版:(MVCC實現原理)
在每行記錄後面儲存兩個隱藏的列來實現,一個儲存了行的建立版本號,一個儲存行的過期版本號(刪除版本號)。

版本號:
1. 系統版本號:每開始一個新的事務,系統版本號就會自動增加
2. 事務版本號:事務開始時刻的系統版本號

當執行select操作時候:
1. 只查詢版本早於當前事務版本的資料行。 確保事務讀取的行,在事務開始之前就存在的,或者是事務自身插入或者修改過的。
2. 行的刪除版本號要麼未定義,要麼大於當前事務版本號。 確保事務查詢到的行,在事務開始之前沒被刪除。

insert操作:
為新插入的每一行儲存當前系統版本號為行建立版本號。

delete操作:
為刪除的行儲存當前系統版本號作為行刪除版本號。

update操作:
為插入一行新資料儲存當前版本號作為該新行行建立版本號,同時儲存當前系統版本號到原來的行作為行刪除版本號。

可見update = delete+insert

採用MVCC這個原理,大多操作可以不用加鎖,使得讀資料操作簡單,效能好,缺點是額外的儲存空間消耗,更多的行檢查和維護工作。MVCC只能在REPEATABLE READ 和READ COMMITTED兩個隔離級別下工作。其他兩個隔離級別跟MVCC不相容。

相關推薦

高效能MySQL -MySQL架構MVCC版本併發控制一些基本概念

內容源於《高效能MySQL》 一、MySQL邏輯架構 架構圖: 最上層不是Mysql獨有的, 比如連線處理,授權認證, 安全 等等 第二層核心服務功能,包括查詢解析,分析,優化,快取以及所有內建函式,儲存過程,觸發器,檢視等都在這層實現 第三層

關於mysql可重複讀的原因幻讀的解決(MVCC-版本併發控制

第三個隔離級別RR可以解決不可重複度的問題,那什麼是可重複讀: Repeatable Read(可重複讀):一個事務在執行過程中可以看到其他事務已經提交的新插入的記錄(讀已經提交的,其實是讀早於本事務開始且已經提交的),但是不能看到其他事務對已有記錄的更新(即晚於本事務開始的),並且,該事務

MySQL MVCC(版本併發控制)

概述   為了提高併發MySQL加入了多版本併發控制,它把舊版本記錄儲存在了共享表空間(undolog),當事務提交之後將重做日誌寫入磁碟(前提innodb_flush_log_at_trx_commit為1)清空undolog,在5.6版本之後unodlog可以獨立出共享表空間,引入MVCC的目的就是減少

MySQL的事務機制鎖(InnoDB引擎、MVCC版本併發控制技術)

# 一、事務(資料庫的事務都通用的定義) ## 1.1 事務定義 事務是由一步或幾步資料庫操作序列組成邏輯執行單元,這系列操作要麼全部執行,要麼全部放棄執行。事務通常以 `BEGIN TRANSACTION` 開始,以`COMMIT` 或 `ROLLBACK` 操作結束: * `COMMIT

MySQL版本併發控制機制(MVCC)-原始碼淺析

前言 作為一個數據庫愛好者,自己動手寫過簡單的SQL解析器以及儲存引擎,但感覺還是不夠過癮。<<事務處理-概念與技術>>誠然講的非常透徹,但只能提綱挈領,不能讓你玩轉某個真正的資料庫。感謝cmake,能夠讓我在mac上用xcode去debug MySQL,從而能去領略它的

MySQL版本併發控制——MVCC機制分析

MVCC,即多版本併發控制(Multi-Version Concurrency Control)指的是,通過版本鏈維護一個數據的多個版本,使得讀寫操作沒有衝突,可保證不同事務讀寫、寫讀操作併發執行,提高系統性能。 實際上,innodb中“**讀已提交**”和“**可重複讀**”這兩種隔離級別的事務在查詢資料

版本併發控制(MVCC)

MVCC是行級鎖的一個變種,在很多情況下避免了加鎖操作,開銷很低,雖然實現機制不同,大多實現了非阻塞的讀操作,寫操作也只鎖定必要的行 InnoDB的MVCC,是通過在每行記錄後面儲存兩個隱藏的列來實現的。這兩個列,一個是行的建立時間,一個是行的過期時間或刪除時

innodb併發控制mvcc版本併發控制

   innodb有四種事務隔離機制,read uncommitted、read committed、repeatted read、 serializable,隔離界別依次提高,而且基本靠鎖實現這些隔離級別,但眾所周知,鎖的消耗是很大的。當然,我們也都知道,mysql實現了

MVCC版本併發控制器

在多個事務併發執行的時候,MVCC機制可以協調資料的可見性,事務的隔離級別就是建立在MVCC之上的; MVCC機制通過undo log鏈和ReadView機制來實現; undo log版本鏈:     在資料庫的每行記錄中,都有兩個隱藏欄位,trx_id和roll_pointer,tr

從一次“併發修改欄位業務”引出版本併發控制與InnoDB鎖

併發欄位修改業務 最近在主要在做“工作流引擎”課題的預研工作,在涉及到“會籤任務”(工作流業務概念,這與我們今天討論文問題沒有太多關聯)的時候,遇到了一個併發修改同一個欄位的應用場景。 大致是由於要等一個活動節點的所有例項任務都完成之後才能繼續向下流轉,則引擎必須在每次任務提交的時候進行判斷。我選擇了在資料庫

執行緒涉及的一些基本概念

在看多執行緒之前看一些基本概念 一: 執行緒:執行緒是CPU排程(執行任務)的最小單位;其實質就是一段程式碼(一個任務) 程序:系統中正在執行的一個應用程式;程序是CPU分配資源和排程的單位 兩者的聯絡與區別:

雲端儲存---ceph簡介架構原理一些基本概念

我們在上篇文章已經對比了不同的儲存系統之間的區別,本章開始逐步深入記錄Ceph的學習和運用。 Ceph簡介 Ceph是一個分散式儲存系統,提供物件,塊和檔案儲存,是一個免費開源軟體的儲存解決方案,可以部署於普通的x86相容伺服器上,可用於解決統一儲存的i

mysql】--MVCC 版本控制

InnoDB的mvcc,是通過在每行記錄後面儲存兩個隱藏的列來實現的。這兩個列,一個儲存了行的建立時間,一個儲存行的過期時間(刪除時間)。儲存的並不是實際的時間,而是系統版本號。每一個新的事物,系統版本號都會遞增。 事物開始時刻的系統版本號會作為事務的版本號,用來和查詢到的每行記錄的版本號進行比

MySQL學習筆記--MySQL邏輯架構sql寫與載入順序以及七種JOIN模式圖解

一、MySQL的邏輯架構MySQL的最大特點是其外掛式的儲存引擎架構將查詢處理和其他的系統任務以及資料的儲存,提取相分離。這種架構可以根據業務的需求和實際需求選擇合適的儲存引擎。正因為外掛式引擎的特點它的架構可以在多種不同的場景中應用併發揮良好的效能。1. 連線層:為請求做連

ubuntu 配置 java jdk1.8 環境增加版本 jdk 切換方法

其它 web oracle -i serve server pre jdk6 runtime 一、安裝java jdk1.8 1.添加軟件源 sudo add-apt-repository ppa:webupd8team/java 2.更新軟件源 sudo apt-g

Atitit 微服務 分散式 區別 微服務的判斷標準 目錄 1.1. 區別 微服務側重於微小服務程序隔離級別分散式側重於機器隔離 1 2. 微服務是一種架構微才叫微? 1 2.1. 微服務

Atitit 微服務 分散式 區別 微服務的判斷標準   目錄 1.1. 區別 微服務側重於微小服務程序隔離級別,分散式側重於機器隔離 1 2. 微服務是一種架構, 。多微才叫微? 1 2.1. 微服務核心要素是微小以及程序隔離 1 2.2. 一般微服務標

某些免安裝版本mysql找不到my.ini的解決方案一些常用配置(如mysql 5.56)

忘記從哪看到的原文了,沒辦法引用真的不好意思,歡迎共同學習批評指正。 大概原因是某些版本只提供幾個備選的配置檔案供人選擇, 在這幾個中選一個改名成 my.int就好了 有的可能不行,可以多改幾個試試 像我huge就不行得用medium 順便附上一些常用ini配置

linuxpython 版本共存不同版本PIP如何使用

序言:             相信大家,在工作中都會遇到這樣的問題,有的程式開始限定是用python那個版本,或者說我們在公用伺服器上面,不想別人更改我們的環境,今天給大家介紹怎麼來在home目錄下面建一個自己的目錄,建一個屬於自己的庫。 1:python的安裝。  

Greenplum的MVCC版本控制的簡單介紹(主要涉及cmin,cmax,xmin,xmax說明)

熟悉Greenplum資料庫的朋友應該都知道,GP底層是使用PostgreSQL資料庫來實行MPP架構的,而對於事務控制這一塊,也是使用PostgreSQL的多版本控制MVCC,實現了讀寫分離,顯然就會

Atitit 微服務 分散式 區別 微服務的判斷標準 目錄 1.1. 區別 微服務側重於微小服務程序隔離級別分散式側重於機器隔離 1 2. 微服務是一種架構微才叫微? 1 2.1. 微服務

Atitit 微服務 分散式 區別 微服務的判斷標準 目錄 區別 微服務側重於微小服務程序隔離級別,分散式側重於機器隔離 微服務是一種架構,。多微才叫微? 微服務核心要素是微小以及程序隔離 這個一般根據企業