簡單的聊下 MySQL InnoDB 的各種記憶體元件及原理
創作不易,關注、點贊,分享,轉發,評論,收藏,謝謝。
1、InnoDB 簡介
Innodb引擎 提供了對資料庫ACID事務的支援,以及提供了行級鎖和外鍵的限制。InnoDB是MySQL的預設事務型引擎,確定事務的完整送出(Commit)和復原(Rollback)。
InnoDB是Mysql資料庫中最重要的存儲引擎,想要搞清楚它的結構及各種機制的實作原理對一個成熟的程式員來說非常重要。今天和大家一起讨論一下InnoDB的結構。
- 首先來看一下InnoDB存儲引擎簡介圖
InnoDB的底層結構主要由記憶體結構和磁盤結構組成,大緻情況如下:
1、記憶體結構
- Buffer Pool
- Change Buffer
- Adaptive Hash Index
- Log Buffer
2、磁盤結構
- Tables
- Indexes
- Tablespaces
- Doublewrite Buffer
- Redo Log
- Undo Logs
2、INNODB記憶體結構
- InnoDB結構圖,如下圖所示。
MySQL中每次執行一條SQL語句,對相應表的讀寫是有存儲引擎去執行(更新資料、查詢資料)。存儲引擎會按照内部邏輯與記憶體、硬碟互動。
- 下圖是存儲引擎執行流程:
InnoDB記憶體結構詳解
InnoDB存儲引擎在記憶體中有兩個非常重要的元件
- 緩沖池(Buffer Pool)
- 重做日志緩存(redo log buffer)。
3、Buffer Pool
緩沖池中會緩存很多資料,比如資料頁、索引頁、鎖資訊等等。
緩沖池是主存中的一個區域,InnoDB在通路它時在這裡緩存表和索引資料。
緩沖池用于存儲各種資料緩存。Innodb總是按頁(16K)将資料(資料庫檔案)從磁盤讀入緩沖池,然後根據最近最少使用算法(LRU)将資料儲存在緩沖池中。
- 緩存執行流程如下圖:
Buffer Pool 會緩存很多的資料,以便後續的查詢與更新,提高了查詢檢索速度。
- 經典面試題之InnoDB的緩沖池緩存什麼?有什麼用?
緩存表資料與索引資料,把磁盤上的資料加載到緩沖池,避免每次通路都進行磁盤IO,起到加速通路的作用。
總結:
(1)緩沖池(buffer pool)總的來說是一種常見的降低磁盤IO通路的機制,提高檢索速度;
(2)緩沖池通常以頁(page)為機關進行緩存資料,分為資料頁(data page)與索引頁(index page);
(3)緩沖池的常見管理算法是LRU。
(4)InnoDB對普通LRU進行了優化。
4、redo log buffer 簡介
日志緩沖區是用于存儲要寫入磁盤的日志檔案資料的記憶體區域。
日志緩沖區大小由innodb_log_buffer_size變量定義,預設大小為16MB。日志緩沖區的内容會定期重新整理到磁盤。大型日志緩沖區允許運作大型事務,而無需在送出事務之前将重做日志資料寫入磁盤。是以,如果您有更新、插入或删除許多行的事務,增加日志緩沖區的大小可以節省磁盤I/O。
總結
本文主要介紹了InnoDB引擎的結構,并重點介紹了記憶體結構的各個組成部分。
1.InnoDB引擎的結構分為記憶體結構和磁盤結構。
2.記憶體結構由緩沖池、寫緩沖區、日志緩沖區和自适應哈希索引組成。
3.緩沖池主要緩存表資料和索引資料,以加快通路速度。在内部,使用基于LRU算法的變體算法來管理緩存對象。
4.更改緩沖區主要用于緩存輔助索引的更新操作,以加快輔助索引的更新。
日志緩沖區使大型事務能夠運作,而無需在送出事務之前将重做日志資料寫入磁盤,進而節省了磁盤I/O.請注意,在送出事務時,有三種政策來重新整理重做日志。
5、MySQL支援的引擎
結束語
擷取更多有價值的文章,那就關注一下吧。。。。。。。