天天看點

InnoDB存儲引擎MVCC實作原理

簡單背景介紹

MySQL

MySQL是現在最流行的關系型資料庫(RDB)的選擇,為了應用程式提供可靠性資料存儲,事務等功能。近些年來也成為了網際網路公司的首選。在5.5版本後,預設使用InnoDB存儲引擎。

MySQL架構

頂層是接入層,為不同語言實作接入,接入層負責權限校驗,線程池管理,線程管理。接下來是MySQL服務層,有SQL解析器,SQL優化器,資料緩沖,緩存。再接下來是存儲引擎。最後是系統檔案層。

InnoDB與MVCC

MySQL中的InnoDB存儲引擎的特性有,預設級别的Repeatable Read,行級鎖,實作了MVCC,Consistent nonlocking read(預設讀不加鎖,一緻性非鎖定讀),Insert Buffer,Adaptive Hash Index,Double Write,Cluster Index。

上面舉了這麼多例子,說明InnoDB有很多特性,并且很快。

InnoDB中通過Undo Log實作了資料的多版本,而并發控制通過鎖來實作。

Undo Log除了實作了MVCC之外,還提供了復原的功能。

Redo log,Undo log, Bin log

MySQL InnoDB有很多日志,除了錯誤日志,查詢日志還有很多與持久化相關的日志。

bin log:由MySQL服務層産生的日志,通常用于資料恢複,資料庫複制。比如常見的master-slave模式,就是通過binlog實作的,另外binlog還能實作mysql複制到其他資料源,比如:ElasticSearch。

redo log:記錄了資料在實體層面到修改,MySQL中使用了大量到緩存,當緩存中的資料與磁盤中的資料不一緻時,這是記憶體裡的資料稱為髒頁(dirty page)。為了保證資料的安全性,事務中不斷産生redo log,在事務送出的時候會進行一次flush操作,儲存到磁盤,redolog是順序寫入,性能遠大于随機讀寫。當MySQL故障恢複時,會加載redo log中的資料,如果redo log中有事務送出,則進行送出修改資料。這樣保證了事務的一緻性,原子性,持久性。

undo log:除了記錄redo log之外,還會記錄undo log,undo log記錄資料的逆向操作,比如修改删除操作,記錄的是資料修改前的值,用于復原,以及版本回溯。可以根據undo log找到某個特定版本的值,這樣就實作了MVCC。

redo log和bin log要具有一緻性,為了實作一緻性,MySQL采用了二階段送出。

MVCC實作

undo log分為Insert和Update兩種,Delete操作也被看做是一種特殊的Update,在記錄上标記被删除。

對于Insert操作,插入時候生成Insert undo log,在事務送出後,即可删除undo log,因為沒有其他的事務需要這個undo log。

在進行Update操作的時候,會生成新的undo log,将目前記錄中的db_roll_ptr指向新的undo log。

RR級别下事務開始後的第一個snapshot read的時候,會将目前活動的事務id記錄下來,記錄到read view中。

繼續閱讀