InnoDB儲存引擎

2021-10-23 17:36:36 字數 2066 閱讀 5938

後台程序——》innodb緩衝池——》磁碟檔案

主要是負責重新整理快取池裡的資料,保證緩衝池中的資料是最近的。

master thread:將緩衝池中的資料非同步重新整理到磁碟中,保證資料的一致性。

io thread:使用大量的aio進行io呼叫,處理io請求

​ innodb_write_io_threads:4

​ innodb_read_io_threads:4

purge thread:清理已經使用並且分配的undo頁

page cleaner thread:髒頁的重新整理操作

innodb儲存引擎是基於磁碟儲存的,利用緩衝池提高mysql的整體效能。

主要作用:

使用innodb_buffer_pool_size分配緩衝池大小

使用innodb_buffer_pool_instances設定緩衝池例項個數

讀取磁碟檔案過程:

檢查該頁是否在緩衝池中被命中

如果有,則直接讀取;如果沒有,則讀取磁碟上的頁,存入緩衝池(這個過程被稱為將頁「fix」到緩衝池)

緩衝池採用checkpoint機制將緩衝池中修改過的頁重新整理到硬碟

緩衝池中主要包括:索引頁、資料頁、自適應雜湊索引、插入緩衝、undo頁、資料字典資訊、鎖資訊

[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-vox3mayr-1598189072334)(d:\學習\資料庫\mysql\img\innodb記憶體資料物件.jpg)]

緩衝池通過lru(latest recent used)演算法用來管理。

使用最頻繁的資料(熱點資料)放入lru list的前端,而使用最少的資料放入list的末尾。當緩衝池不能放入新讀取的頁時,刪除list末尾的頁,然後將新讀取的頁插入到lru list的前端。(為了減少資料移動次數,lru list一般使用鍊錶實現)

在mysql中對傳統的lru演算法進行改進。

為什麼改進?

傳統lru演算法的缺陷:

針對預讀失效的優化

[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-k6ovjpgs-1598189072338)(d:\學習\資料庫\mysql\img\innodb-buffer-pool-list.png)]

mysql將lru list分為new list和old list,比例為5:3,new list和old list的分割點稱為midpoint。每次將預讀的資料插入old list的頭部,即整個列表的5/8處,當真正使用到這個頁時,才插入到new list的頭部。

使用引數innodb_old_blocks_pct來指定midpoint的位置,預設為37%。

針對緩衝池汙染的優化

innodb引入了另乙個引數innodb_old_blocks_time來解決這個問題。該引數表示也讀取到midpoint位置後還需要過多久才能加入到new list部分,使用該引數可以一定程度上保證熱點資料不被重新整理出lru list。

free list

存放空的頁(free page),當資料庫剛剛啟動時,lru list為空。當需要從緩衝池中申請頁時,先詢問free list是否還有空閒頁,有則刪除free list的空閒頁,放入到lru list中。否則,lru list直接刪除尾端的頁,將多出來的空間分配給新頁。

unzip list

管理壓縮頁(大小非16k的頁),如1k、2k、4k、8k

flush list

用來管理髒頁(dirty page),即lru列表中的頁被修改了之後,與磁碟中的資料不一致。innodb使用flush list來管理髒頁,採用checkpoint機制重新整理到磁碟,保證資料的一致性。注意:髒頁同時存在與lru list與flush list中,兩者不衝突,lru list管理資料可用性。

innodb現將重做日誌儲存到重做日誌緩衝,然後按一定頻率重新整理到重做日誌檔案。

innodb_log_buffer_size=8m

將重做日誌重新整理到重做日誌檔案中的3中情況:

log_buffer_size=8m

將重做日誌重新整理到重做日誌檔案中的3中情況:

在對一些資料結構本身的記憶體進行分配時,需要從額外的記憶體池中進行申請,當該區域的記憶體不夠的時候,會從緩衝池進行申請。

InnoDB 儲存引擎

innodb是事務型資料庫的首選引擎,支援事務安全表 acid 支援行鎖定和外來鍵。mysql 5.5.5 之後,innodb作為預設儲存引擎。innodb的主要特性有一下幾項。a.innodb給mysql提供了具有提交 回滾和崩潰恢復能力的事務安全 acid相容 儲存引擎。innodb鎖定在行級並...

InnoDB 儲存引擎

設計上採用了類似於oracle資料庫的架構 接下來 詳細介紹 innodb 儲存引擎的 體系架構 及其不同於其他儲存引擎的特性 一 概述 innodb 儲存引擎 是第乙個完整支援acid事物的 mysql 儲存引擎 特點 1 行鎖設計 2 支援mvcc 3 提供一致性非鎖定讀 4 最有效地利用 以及...

InnoDB儲存引擎

內外存交換的基本單位 mysql將資料從外存讀入記憶體不是以記錄為單位,這樣消耗太大,是以頁為單位,每個頁裡填充記錄。每頁大小為16kb。記錄堆 行記錄儲存區,分為有效記錄和已刪除記錄兩種 自由空間鍊錶 已刪除記錄組成的鍊錶 未分配空間 頁尾 儲存頁面校驗資訊 頁內的資料是按照主鍵的順序有序儲存的。...