Innodb結構

從MySQL5.5版本開始默認使用InnoDB作為引擎,它擅長處理事務,具有自動崩滿恢復的特性,在日常開發中使用非常廣泛,下面是言方的InnoDB引擎美構圖,主要分為內存結構和磁盤結構兩大部分。?

?內存結構主要包括Buffer Pool、Change Buffer、Adaptive Hash Index和Log Buffer四大組件。
Buffer Pool:緩沖池,簡稱BP。BP以Page頁為單位,默認大小16K,BP的底層采用鏈表數據結構管理Page。在InnoDB訪問表記錄和索引時會在Page頁中緩存,以后使用可以減少磁盤IO操作,提升效率。

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

對于innodb存儲引擎而言,其緩沖池的配置通過參數innodb_buffer_ pool_size來設置。這是影響innodb性能的關鍵參數。具體來看,緩沖池中緩存的數據頁類型有:索引頁,數據頁,undo頁,插入緩沖(insert buffer),自適應哈希索引(adaptive hash index),innodb存儲的鎖信息(lock info),數據字典信息(data dictionary)等。不能簡單的認為,緩沖池只是緩存索引頁和數據頁,它們只是占緩沖池很大的一部分而已。

Page管理機制
? Page根據狀態可以分為三種類型:
? ? ?·free page:空閑page,未被使用
? ? ?·clean page:被使用page,數據沒有被修改過
? ? ?·dirty page:臟頁,被使用page,數據被修改過,頁中數據和磁盤的數據產生了不一致

針對上述三種page類型,InnoDB通過三種鏈表結構來維護和管理
? ? ·free list:表示空閑緩沖區,管理free page
? ? ·flush list:表示需要刷新到磁盤的緩沖區,管理dirty page,內部page按修改時間排序。臟頁即? ? ? ? ? ? ? ? ? ? ? ?存在你flush鏈表,也在LRU鏈表中,但是兩種互不影響,LRU鏈表負責管理page的? ? ? ? ? ? ? ? ? ? ? ? ?可用性和釋放,而flush鏈表負責管理臟頁的刷盤操作。
? ? ·Iru list:表示正在使用的緩沖區,管理clean page和dirty page,緩沖區以midpoint為基點,前? ? ? ? ? ? ? ? ? ? ? 面鏈表稱為new列表區,存放經常訪問的數據,占63%;后面的鏈表稱為old列表區,? ? ? ? ? ? ? ? ? ? ? 存放使用較少數據,占37%。
改進型LRU算法維護
? ? 普通LRU:未尾淘汰法,新數據從鏈表頭部加入,釋放空間時從未尾淘汰
? ? 改性LRU:鏈表分為new和old兩個部分,加入元素時并不是從表頭插入,而是從中間midpoint? ? ? ? ? ? ? ? ? ? ? ? ?位置插入,如果數據很快被訪問,那么page就會向new列表頭部移動,如果數據沒? ? ? ? ? ? ? ? ? ? ? ? ?有被訪問,會逐步向old尾部移動,等待淘汰。

? ? ? ? ? ? ? ? ? ? ?每當有新的page數據讀取到buffer pool時,InnoDb引擎會判斷是否有空閑頁,是否? ? ? ? ? ? ? ? ? ? ? ? ?足夠,如果有就將free page從free list列表刪除,放入到LRU列表中。沒有空閑頁,? ? ? ? ? ? ? ? ? ? ? ? 就會根據LRU算法淘汰LRU鏈表默認的頁,將內存空間釋放分配給新的頁。

BUffer pool配置參數:

show variables like%innodb_page_size%;/查看page頁大小

show variables like 9%innodb_old%;//查看ru list中old列表參數

show variables like9%innodb_buffer%;//查看buffer pool參數

建議:將innodb_buffer_pool_size設置為總內存的60%-80%,innodb_buffer_pool_instances可以設置為多個,這樣可以避免緩存爭奪。|

從innodb1.0.x版本開始,允許有多個緩沖池實例。每個頁根據哈希值平均分配到不同緩沖池實例中。這樣做的好處是減少數據庫內部的資源競爭。增加數據庫的并發處理能力。通過參數innodb_buffer_pool_instances來進行配置。該值默認為1。在配置文件中將innodb_buffer_pool_instances設置為大于1的值就可以得到多個緩沖池實例。

注意:innodb_buffer_pool_size必須大于1GB,生成innodb_buffer_pool多實例才有效,最多支持64個innodb_buffer_pool實例。

?Change Buffer:寫緩沖區,簡稱CB。在進行DML操作時,如果BP沒有其相應的Page數據,并不會立刻將磁盤頁加載到緩沖池,而是在CB記錄緩沖變更,等未來數據被讀取時,再將數據合并恢復到BP中。
ChangeBuffer占用BufferPool空間,默認占25%,最大允許占50%,可以根據讀寫業務量來進行調整。
參數innodb_change_buffer_max size;當更新一條記錄時,該記錄在BufferPool存在,直接在BufferPool修改,一次內存操作。如果該記錄在BufferPool不存在(沒有命中),會直接在ChangeBuffer進行一次內存操作,不用再去磁盤查詢數據,避免一次磁盤1O。當下次查詢記錄時,會先進性磁盤讀取,然后再從ChangeBuffer中讀取信息合并,最終載入BufferPool中。
寫緩沖區,僅適用于非準一普通索引頁,為什么?
如果在索引設置唯一性,在進行修改時,InnoDB必須要做唯一性校驗,因此必須查詢磁盤,做一次I0操作。會直接將記錄查詢到BufferPool中,然后在緩沖池修改,不會在ChangeBufer操作。

Adaptive Hash Index:自適應哈希索引,用于優化對BP數據的查詢。InnoDB存儲引擎會監控對表索引的查找,如果觀察到建立哈希索引可以帶來速度的提升,則建立哈希索引,所以稱之為自適應。InnoDB存儲引擎會自動根據訪問的頻率和模式來為某些頁建立哈希索引。
Log Bufer:日志緩沖區,用來保存要寫入磁盤上log文件(Redo/Undo)的數據,日志緩沖區的內容定期刷新到磁盤log文件中。日志緩沖區滿時會自動將其刷新到磁盤,當遇到BLOB或多行更新的大事務操作時,增加日志緩沖區可以節省磁盤/O。
LogBuffer主要是用于記錄InnoDB引擎日志,在DML操作時會產生Redo和Undo日志。
LogBuffer空間滿了,會自動寫入磁盤。
innodb_flush_log at trxrcommit參數控制日志刷新行為,默認為1
? 0:每隔1秒寫日志文件和刷盤操作(寫日志文件LogBuffer->oS cache,刷盤OS cache->磁盤文? ? ? ? ? 件),最多丟失1秒數據
?1:事務提交,立刻寫日志文件和刷盤,數據不丟失,但是會頻繁10操作
?2:事務提交,立刻寫日志文件,每隔1秒鐘進行刷盤操伸

從上圖大致可以看到innodb有多個內存塊,可以認為這些內存塊組成了一個大的內存池,負責如下工作:

1.維護所有進程/線程需要訪問的多個內部數據結構。

2.緩存磁盤上的數據,方便快速的讀取,同時在對磁盤文件的數據修改之前在這里緩存。

3.重做日志(redo log)緩沖

一.后臺線程的主要作用是負責刷新內存池中的數據,保證緩沖池中的內存緩存的是最新最近的數據。此外將已經修改的數據文件刷新到磁盤文件,同時保證在數據庫發生異常的情況下innodb能恢復正常的運行狀態。

后臺線程:

Innodb存儲引擎是多線程的模型,因此其后臺有多個不同的后臺線程,負責處理不同的任務。

1.Master Thread

Master Thread 是非常核心的后臺線程,主要負責將緩沖池中的數據異步刷新到磁盤,保證數據的一致性,包括臟頁的刷新,合并插入緩沖(insert buffer),undo頁的回收等。

2.IO Thread

在innodb存儲引擎中大量使用了AIO(Async IO)來處理寫IO請求,這樣可以極大提高數據庫的性能。而IO Thread的工作主要負責這些IO請求的回調(call back)處理。在innodb 1.0版本之前共有4個IO Thread,分別是write,read,insert buffer和log IO thread。從innodb 1.0.x版本開始,read thread和write thread分別增大到了4個。可以使用innodb_read_io_threads和innodb_write_io_threads參數進行設置。

3. Purge Thread

事務被提交后,其使用的undo log可能不再需要,因此Purge Thread來回收已經使用并分配的undo頁。在innodb 1.1 版本之前,purge操作僅在innodb存儲引擎的Master Thread中完成。從innodb1.1版本開始,purge操作可以獨立到單獨的線程中進行。以此來減輕Master Thread的工作。從而提高CPU的使用率以及提升存儲引擎的性能。可以通過在配置文件中添加如下參數來開啟獨立的Purge Thread(清洗線程)

?在innodb1.1版本中,即使innodb_purge_threads設為大于1,innodb存儲引擎啟動時也會將其設為1,從innodb1.2版本開始,innodb支持多個Purge Thread,這樣做的目的是為了進一步加快undo頁的回收。同時由于Purge Thread需要離散的讀取undo頁,這樣可以更好的利用磁盤的隨機讀取性能。

4.Page cleaner Thread

page cleaner thread線程是在innodb 1.2.x的版本中引入的。其作用是將之前的版本中的臟頁刷新操作都放入到單獨的線程中來完成。而其目的是為了減輕原Master Thread的工作及對于用戶查詢線程的阻塞,進一步提高innodb存儲引擎的性能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535322.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535322.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535322.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ES備份工具elasticdump

安裝 下載node下載 | Node.js 中文網 tar xvf node-v16.5.0-linux-x64.tar.xz ln -s /app/temp/node-v16.5.0-linux-x64/bin/node /usr/bin/node ln -s /app/temp/node-v16.5.0-linux-x64/bin/npm /usr/bin/npm npm install elasticdump -g npm config get cache npm in…

innodb_flush_method理解【轉】

innodb_flush_method這個參數控制著innodb數據文件及redo log的打開、刷寫模式,對于這個參數,文檔上是這樣描述的: 有三個值:fdatasync(默認),O_DSYNC,O_DIRECT 默認是fdatasync,調用fsync()去…

linux下的/dev/shm/

首先可以看出來/dev/shm是一個設備文件, 可以把/dev/shm看作是系統內存的入口, 可以把它看做是一塊物理存儲設備,一個tmp filesystem, 你可以通過這個設備向內存中讀寫文件, 以加快某些I/O高的操作,比如對一個大型文件頻繁的open, write, read&#xff0…

2021-07-30

1.服務器級別的鎖等待 可以通過show processlist看到等待鎖的線程id,但是無法知道究竟哪個線程持有鎖 可以通過mysqladmin debug 相關等待鎖的線程以及誰持有鎖可以在錯誤日志中找到 2.存儲引擎層的鎖等待則比較麻煩,以下是innodb存儲引擎中鎖等待以及…

getopt設計shell腳本選項

寫shell腳本的時候,通過while、case、shift來設計腳本的命令行選項是一件比較麻煩的事,因為Unix命令行的選項和參數自由度很高,支持短選項和長選項,參數可能是可選的,選項順序可能是無所謂的,等等。 bash下…

percona-toolkit---pt-heartbeat

對于MySQL數據庫主從復制延遲的監控,可以借助percona的有力武器pt-heartbeat來實現。 pt-heartbeat的工作原理通過使用時間戳方式在主庫上更新特定表,然后在從庫上讀取被更新的時間戳然后與本地系統時間對比來得出其延遲。具體流程: 1&…

定時刪除腳本

#!/bin/sh backup_dir/data/xtrabackup DATEdate %Y-%m-%d #DATE_NOWdate %Y-%m-%d.%H%M DATE_NOWdate %Y-%m-%d PATH/usr/local/mysql/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin export PATHbinog保留7天 binlog/data/binlogserver binlog_Rtime7#備…

percona-toolkit--pt-table-checksum

pt-table-checksum 是 Percona-Toolkit的組件之一,用于檢測MySQL主、從庫的數據是否一致。其原理是在主庫執行基于statement的sql語句來生成主庫數據塊的checksum,把相同的sql語句傳遞到從庫執行,并在從庫上計算相同數據塊的checksum&#xf…

Docker容器間網絡通信

自從Docker容器出現以來,容器網絡通信就一直是被關注的焦點,也是生產環境的迫切需求。容器網絡通信又分為兩大方面:單主機容器上的相互通信,和跨主機的容器相互通信。 一、Docker單主機容器通信 基于對net namespace的控制&#…

Docker容器的重啟策略

1. Docker容器的重啟策略 Docker容器的重啟策略是面向生產環境的一個啟動策略,在開發過程中可以忽略該策略。 Docker容器的重啟都是由Docker守護進程完成的,因此與守護進程息息相關。 Docker容器的重啟策略如下: no,默認策略&…

innobackupex實現導出和導入單張表

默認情況下,InnoDB表不能通過直接復制表文件的方式在mysql服務器之間進行移植,即便使用了innodb_file_per_table選項。而使用Xtrabackup工具可以實現此種功能,不過只能"導出"具有.ibd文件的表,也就是說導出表的mysql服務…

xtrabackup工具

(1).備份過程 和innobackupex備份過程不同的是,xtrabackup的備份路徑是由"--target-dir"選項嚴格指定的,如果指定的目錄不存在,它備份的時候不會在target-dir目錄中再創建時間戳子目錄。 [rootxuexi data]# xtrabackup --backup …

mysql數據庫參數

注意:在配置binlog相關變量的時候,相關變量名總是搞混,因為有的是binlog,有的是log_bin,當他們分開的時候,log在前,當它們一起的時候,bin在前。在配置文件中也同樣如此。 log_bin …

oracle命令行安裝

cd /home/oracle/databases/runInstaller -silent -force -showprogress -responseFile /home/oracle/database/db_install.rsp -ignoreSysPrereqs -ignorePrereqdbca -silent -responseFile pwd/dbca.rspnetca -silent -responseFile /home/oracle/databases/netca.rsp

定期刪除數據腳本

#!/bin/sh backup_dir/data/xtrabackup DATEdate %Y-%m-%d #DATE_NOWdate %Y-%m-%d.%H%M DATE_NOWdate %Y-%m-%d PATH/usr/local/mysql/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin export PATH#binog保留7天 binlog/data/binlogserver binlog_Rtime7#備…

定期備份數據庫腳本

#!/bin/bash MasterIp* USERroot PORT3306 PASSWD000000 DATEdate %Y-%m-%d #DATE_NOWdate %Y-%m-%d.%H%M DATE_NOWdate %Y-%m-%d OLDDATEdate %Y-%m-%d -d "30 days ago"  #全表備份 BACKUPDIR/data/mysql_backup/fulltable #單表tb_trcevt備份 datapath/data/mysq…

日志清理腳本

#!/bin/bash#定義日志所在分區當前空間所占比例數(去掉%)。grep -w表示精準匹配,只匹配"/"這個分區 LOG_PARTITION$(which df -h|awk {print $5,$6}|grep -w "/"|cut -d" " -f1|awk -F"%" {print $1}) #定義一周前的日期&a…

k8s二進制安裝

1. 前言 之前文章安裝 kubernetes 集群,都是使用 kubeadm 安裝,然鵝很多公司也采用二進制方式搭建集群。這篇文章主要講解,如何采用二進制包來搭建完整的高可用集群。相比使用 kubeadm 搭建,二進制搭建要繁瑣很多,需要…

Logstash mutate 插件

mutate 插件可以在字段上執行變換,包括重命名、刪除、替換和修改。這個插件相當常用。 比如: 你已經根據 Grok 表達式將 Tomcat 日志的內容放到各個字段中,想把狀態碼、字節大小或是響應時間,轉換成整型;你已經根據正則…

nginx日志分析腳本

#!/usr/bin/env bashecho "" echo " " echo " \ Nginx日志安全分析腳本 V1.0 / " echo " " echo " # 支持Nginx日志分析,攻擊告警分析等 " echo " # auth…