MySQL的innodb引擎是如何實現MVCC的

2021-08-25 11:20:07 字數 1230 閱讀 5713

索引的資料結構有b+treee索引和hash索引:b+treee索引是innodb引擎預設使用的資料結構,它通過一定的演算法,將mysql表中資料分磁碟存放,少量的磁碟讀取即可做到大量資料的遍歷;hash索引根據hash演算法將資料,精確的存放,來查詢某個資料的時候,根據相同的演算法一次就能找到,等值查詢,效率非常高,但hash索引只能等值查詢,而且容易發生hash碰撞。

innodb會為每一行新增兩個字段,分別表示該行建立的版本刪除的版本,填入的是事務的版本號,這個版本號隨著事務的建立不斷遞增。在repeated read的隔離級別(事務的隔離級別請看這篇文章)下,具體各種資料庫操作的實現:

insert:將新插入的行的建立版本號設定為當前系統的版本號。

delete:將要刪除的行的刪除版本號設定為當前系統的版本號。

update:不執行原地update,而是轉換成insert + delete。將舊行的刪除版本號設定為當前版本號,並將新行insert同時設定建立版本號為當前版本號。

其中,寫操作(insert、delete和update)執行時,需要將系統版本號遞增。

​ 由於舊資料並不真正的刪除,所以必須對這些資料進行清理,innodb會開啟乙個後台執行緒執行清理工作,具體的規則是將刪除版本號小於當前系統版本的行刪除,這個過程叫做purge。

通過mvcc很好的實現了事務的隔離性,可以達到repeated read級別,要實現serializable還必須加鎖。

為了實現mvcc,innodb對每一行都加上兩個隱含的列,其中一列儲存行被更新的時間,另外一列儲存行被刪除的時間。但是innodb儲存的並不是絕對的時間,而是與時間對應的資料庫系統的版本號。(儲存這兩個額外系統版本號使大多數讀操作可以不加鎖)

每當乙個事務開始的時候,innodb都會給這個事務分配乙個遞增的版本號。所以版本號也可以被認為是事務號。

對於每乙個查詢語句,innodb都會把這個查詢語句的版本號同查詢遇到的行的版本號進行對比,然後結合不同的事務等級來決定是否返回該行。

innodb只查詢版本號早於當前事務版本的資料號(包括等於)。這樣可以確保事務讀取的行要麼是事務開始前已經存在的,要麼是事務自身插入或修改的。

行的刪除版本號,要麼未定義,要麼大於當前事務版本號。這可以確保事務讀取到的行在事務開始之前未被刪除。

innodb為新插入的每一行儲存當前系統版本號作為行版本號。

innodb為插入一行新記錄,儲存當前系統版本號作為行版本號,同時儲存當前系統版本號為原來的行的刪除標識。

MySQL的儲存引擎INNODB

1 一般情況下,mysql會預設提供多種儲存引擎,你可以通過下面的檢視 看你的mysql現在已提供什麼儲存引擎 mysql show engines 看你的mysql當前預設的儲存引擎 mysql show variables like storage engine 你要看某個錶用了什麼引擎 在顯示...

mysql的innodb儲存引擎

innodb是支援事務的儲存引擎,支援acid特性的acid 指資料庫事務正確執行的四個基本要素的縮寫 包含 原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability 更適合處理大量的小事務,小事務正常都會被提交,很少會被回滾,在資料儲存的...

MySQL儲存引擎 InnoDB

為什麼innodb不將總數存起來?innodb直接count 會遍歷全表 沒有where條件 雖然結果準確,但會導致效能問題。按照效率排序的話,count 字段 innodb一棵b 樹可以存放多少行資料?這個問題的簡單回答是 約2千萬。為什麼是這麼多呢?因為這是可以算出來的,要搞清楚這個問題,我們先...