久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

MySQL存儲引擎之InnoDB架構的知識點有哪些

128次閱讀
沒有評論

共計 3442 個字符,預計需要花費 9 分鐘才能閱讀完成。

本篇內容主要講解“MySQL 存儲引擎之 InnoDB 架構的知識點有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓丸趣 TV 小編來帶大家學習“MySQL 存儲引擎之 InnoDB 架構的知識點有哪些”吧!

一、支持的存儲引擎

進入 MySQL 的數據庫查看存儲引擎就可以看到 MySQL 數據庫所有支持的存儲引擎:

SHOW ENGINES

登錄后復制

目前有一個引擎 Federated 不支持,我們只需要清楚其他八種數據庫存儲就好。

MySQL 中常見的數據庫引擎有 MyISAM、InnoDB、Memory。那么我們就先清楚這三種引擎。

二、InnoDB 引擎

InnoDB 是 MySQL 的默認引擎,一個支持事務安全的存儲引擎。mysql 中數據是存儲在物理磁盤上的,而真正的數據處理又是在內存中執行的。由于磁盤的讀寫速度非常慢,如果每次操作都對磁盤進行頻繁讀寫的話,那么性能就會非常差。

為了上述問題,InnoDB 將數據劃分為若干頁,以頁作為磁盤與內存交互的基本單位,一般頁的大小為 16KB。這樣的話,一次性至少讀取 1 頁數據到內存中或者將 1 頁數據寫入磁盤。通過減少內存與磁盤的交互次數,從而提升性能。

這本質上就是一種典型的緩存設計思想,一般緩存的設計基本都是從時間維度或者空間維度進行考量的:

時間維度:如果一條數據正在在被使用,那么在接下來一段時間內大概率還會再被使用??梢哉J為熱點數據緩存都屬于這種思路的實現。

空間維度:如果一條數據正在在被使用,那么存儲在它附近的數據大概率也會很快被使用。InnoDB 的數據頁和操作系統的頁緩存則是這種思路的體現。

下面是官方的 InnoDB 引擎結構圖,主要分為內存結構和磁盤結構兩大部分。

內存結構主要包括 Buffer Pool、Change Buffer、Adaptive Hash Index 和 Log Buffer 四大組件。

1.Buffer Pool

Buffer Pool 由包含數據、索引、insert buffer ,adaptive hash index,lock 信息及數據字典。緩沖池,簡稱 BP。BP 以 Page 頁為單位,默認大小 16K,BP 的底層采用鏈表數據結構管理 Page。在 InnoDB 訪問表記錄和索引時會在 Page 頁中緩存,以后使用可以減少磁盤 IO 操作,提升效率。

緩沖池簡單來說就是一塊內存區域,通過內存的速度來彌補磁盤速度較慢對數據庫性能的影響。在數據庫中進行讀取頁的操作,首先將從磁盤讀到的頁存放在緩沖池中,這個過程稱為將頁 FIX 在緩沖池中。下一次再讀取相同的頁時,首先判斷該頁是否在緩沖池中。若在緩沖池中,稱該頁在緩沖池中被命中。直接讀取該頁。否則讀取磁盤上的頁。對于數據庫中頁的修改操作,則首先修改在緩沖池中的頁,然后再以一定的頻率刷新到磁盤上。這里需要注意的是,頁從緩沖池刷新回磁盤的操作并不是每次頁發生更新時觸發,而是通過一種稱為 Checkpoint 的機制刷新回磁盤。同樣這也是為了提高數據庫的整體性能。

傳統 LUR 算法

緩沖池是通過 LRU(Latest Recent Used,最近最少使用)算法來進行管理的,即最頻繁使用的頁在 LRU 列表的最前段,而最少使用的頁在 LRU 列表的尾端,當緩沖池不能存放新讀取到的頁時,首先釋放 LRU 列表尾端的頁:

(1)頁已經在緩沖池里,那就只做“移至”LRU 頭部的動作,而沒有頁被淘汰;

(2)頁不在緩沖池里,除了做“放入”LRU 頭部的動作,還要做“淘汰”LRU 尾部頁的動作;

但是 InnoDB 的 LUR 算法并不是傳統的 LUR 算法。

這里有兩個問題:

(1)預讀失效;

(2)緩沖池污染;

我們先了解什么是預讀;

預讀

磁盤讀寫,并不是按需讀取,而是按頁讀取,一次至少讀一頁數據(一般是 4K),如果未來要讀取的數據就在頁中,就能夠省去后續的磁盤 IO,提高效率。數據訪問,通常都遵循“集中讀寫”的原則,使用一些數據,大概率會使用附近的數據,這就是所謂的“局部性原理”,它表明提前加載是有效的,確實能夠減少磁盤 IO。

預讀失效

由于預讀(Read-Ahead),提前把頁放入了緩沖池,但最終 MySQL 并沒有從頁中讀取數據,稱為預讀失效。

要優化預讀失效,思路是:

(1)讓預讀失敗的頁,停留在緩沖池 LRU 里的時間盡可能短;

(2)讓真正被讀取的頁,才挪到緩沖池 LRU 的頭部;

以保證,真正被讀取的熱數據留在緩沖池里的時間盡可能長。

具體方法是:

(1)將 LRU 分為兩個部分:

新生代(new sublist)

老生代(old sublist)

(2)新老生代收尾相連,即:新生代的尾 (tail) 連接著老生代的頭(head);

(3)新頁(例如被預讀的頁)加入緩沖池時,只加入到老生代頭部:

如果數據真正被讀?。A讀成功),才會加入到新生代的頭部

如果數據沒有被讀取,則會比新生代里的“熱數據頁”更早被淘汰出緩沖池

新老生代改進版 LRU 仍然解決不了緩沖池污染的問題。

2.Log Buffer

Log Buffer 用來緩存重做日志。

InnoDB 有兩個非常重要的日志:undo log、redo log

(1)通過 undo log 可以看到數據較早版本,實現 MVCC,或回滾事務等功能。

(2)通過 redo log 用來保證事務持久性。

redo 日志緩沖區是內存存儲區域,用于保存要寫入磁盤上的日志文件的數據。日志緩沖區大小由 innodb_log_buffer_size 變量定義,默認大小為 16MB。

日志緩沖區的內容定期刷新到磁盤。較大的日志緩沖區可以運行大型事務,而無需在事務提交之前將重做日志數據寫入磁盤。因此,如果有更新,插入或刪除許多行的事務,則增加日志緩沖區的大小可以節省磁盤 I /O。

innodb_flush_log_at_trx_commit:控制如何將日志緩沖區的內容寫入并刷新到磁盤。

innodb_flush_log_at_timeout:控制日志刷新頻率。

如果磁盤 I / O 導致性能問題,則需要觀察事務, 例如涉及許多 BLOB 條目的事務。只要 InnoDB 日志緩沖區已滿,便會將其刷新到磁盤,因此增加緩沖區大小可以減少 I /O。

日志文件的缺省數量為兩個: ib_logfile0 和 ib_logfile1。

日志具有固定大小,默認大小取決于 MySQL 版本。

3.Adaptive Hash Index

Adaptive Hash Index 自適應 hash 索引是一種鍵值對的存儲結構,存儲的是熱點頁所在的記錄。InnoDB 存儲引擎會自動根據訪問的頻率和模式 來為某些頁建立哈希索引。

上面的圖就是區分 B + 樹索引和自適應 hash 索引的區別。通過參數 innodb_adaptive_hash_index 來禁用或啟動此特性,默認為開啟。

4.Change Buffer

Change Buffer:MySQL 中數據分為內存和磁盤兩個部分;在 buffer pool 中緩存熱的數據頁和索引頁,減少磁盤讀;通過 change buffer 就是為了緩解磁盤寫的一種手段。

當需要更新一個數據頁時,如果數據頁在內存中就直接更新。如果數據頁不在內存中。在不影響數據一致性的前下,InooDB 會將這些更新操作緩存在 change buffer 中,這樣就不需要從磁盤中讀入這個數據頁了。在下次查詢需要訪問這個數據頁的時候,將數據頁讀入內存,然后執行 change buffer 中與這個頁有關的操作。通過這種方式就能保證這個數據邏輯的正確性。

雖然名字叫作 change buffer,實際上它是可以持久化的數據。也就是說,change buffer 在內存中有拷貝,也會被寫入到磁盤上(ibdata)。

?將 change buffer 中的操作合并到原數據頁,得到最新結果的過程稱為 merge。以下情況會觸發 merge:

訪問這個數據頁;

后臺 master 線程會定期 merge;

數據庫緩沖池不夠用時;

數據庫正常關閉時;

redo log 寫滿時;

change buffer 就是在非唯一普通索引頁不在 buffer pool 中時,對頁進行了寫操作的情況下,先將記錄變更緩沖,等未來數據被讀取時,再將 change buffer 中的操作 merge 到原數據頁的技術。在 MySQL5.5 之前,叫插入緩沖(insert buffer),只針對 insert 做了優化;現在對 delete 和 update 也有效,叫做寫緩沖(change buffer)。

到此,相信大家對“MySQL 存儲引擎之 InnoDB 架構的知識點有哪些”有了更深的了解,不妨來實際操作一番吧!這里是丸趣 TV 網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-13發表,共計3442字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 太白县| 玛曲县| 图们市| 兴文县| 漳平市| 二连浩特市| 福安市| 兴宁市| 南溪县| 东乌| 大同市| 进贤县| 高安市| 炎陵县| 南投市| 麟游县| 祁门县| 锡林浩特市| 什邡市| 平舆县| 安西县| 勐海县| 临泉县| 澄城县| 临清市| 平凉市| 东海县| 尼木县| 古浪县| 锡林浩特市| 囊谦县| 娱乐| 大关县| 大安市| 台中县| 土默特左旗| 乌恰县| 灵川县| 稻城县| 五莲县| 岳西县|