13 SQL進階-InnoDB引擎(8.23)

一、邏輯存儲結構

(1)表空間(ibd文件):一個mysql實例可以對應多個表空間,用于存儲記錄、索引等數據。

cd /var/lib/mysql

(2)段,分為數據段(leaf node segment)、索引段(non-leaf node segment)、回滾段(rollback segment),InnoDB是索引組織表,數據段就是B+樹的非葉子節點。段用來管理多個extent(區)。

(3)區,表空間的單元結構,每個區的大小為1M,默認情況下,InnoDB存儲引擎頁大小為16K,即一個區中一共有64個連續的頁。

(4)頁,是InnoDB存儲引擎磁盤管理的最小單元,每個頁的大小默認為16KB。為了保證頁的連續性,InnoDB存儲引擎每次從磁盤申請4-5個區。

(5)行,InnoDB存儲引擎數據是按行進行存放的。

二、架構

1、架構圖

MySQL5.5版本開始,默認使用InnoDB存儲引擎,它擅長事務處理,具有崩潰恢復特性,在日常開發中使用非常廣泛。

InnoDB架構圖,左側內存結構,右側磁盤結構

2、內存結構

(1)buffer pool:緩沖池

dirty page:緩沖區的頁還沒有刷新到磁盤上。

(2)change buffer:更改緩沖區

對唯一索引和主鍵索引不會操作更改緩沖區。

在執行增刪改語句時,不是直接操作到磁盤,而是將數據變更存放在更改緩沖區,再以一定頻率將將數據放入緩沖池,再刷新到磁盤中。

(3)log buffer:日志緩沖區

(4)adaptive hash index:自適應哈希索引

InnoDB默認不支持哈希索引,默認B+索引。哈希索引不支持范圍查詢,支持等值匹配。

3、磁盤結構

(1)system tablespace:系統表空間

參數:innodb_data_file_path

(2)file-per-table tablespaces(每張表獨立的表空間)

參數:innodb_file_per_table

(3)general tablespaces(通用表空間)

需要通過create tablespace語法創建通用表空間,在創建表時,可以指定該表空間。

語法:

create tablespace xxx add datafile ·file_name· engine = engine_name;

create table xxx tablespace ts_name;

cd /var/lib/mysql

(4)undo tablespace:撤銷表空間

(5)temporary tablespace:臨時表空間

(6)doublewrite buffer files:雙寫緩沖區

?

(7)redo log:重做日志

以循環方式寫入重做日志文件,涉及兩個文件:

4、后臺線程

后臺線程:在合適的時機,將InnoDB存儲引擎緩沖池中的數據刷新到磁盤文件中。

(1)master thread

核心后臺線程,負責調度其他線程,還負責將緩沖池中的數據異步刷新到磁盤中,保持數據的一致性,還包括臟頁的刷新、合并插入緩存、undo頁的回收。

(2)IO Thread

在InnoDB存儲引擎中大量使用了AIO來處理IO請求,可以極大地提高數據庫的性能,而IO Thread主要負責這些IO請求的回調。

(3)Purge Thread

主要用于回收事務已經提交了的undo log,在事務提交之后,undo log可能不用了,就用它來回收。

(4)page cleaner thread

協助master thread刷新臟頁到磁盤的現場,它可以減輕master thread的工作壓力,減少阻塞。

三、事務原理

1、事務原理概述

事務特性:

2、redo log:重做日志

redo log實現持久性

當客戶端發起事務操作時,先操作緩沖區,在緩沖區查找是否有我們要操作的數據,沒有數據則通過后臺線程去磁盤讀取該數據,緩存在緩沖區中,進行增刪改操作后,將增刪改的數據直接寫入redo log buffer,記錄數據頁變化,然后直接將其刷新在磁盤文件redo log file內。過段時間進行臟頁刷新時,若程序出錯,可通過redo log進行恢復。

為WAL(write-ahead logging)先寫日志

每隔一段時間會清理redo log file,因此,這兩個文件是循環寫的。

3、undo log:回滾日志(Ctrl+Z)

undolog實現原子性

在進行update操作時,undo log記錄更新前的數據。

undo log銷毀:當我們在進行回滾操作后,undo log就沒有用了,會進行銷毀,但不會立即刪除,因為還有可能用于MVCC(多版本并發控制)。

4、MVCC(多版本并發控制)

(1)基本概念

①當前讀:

讀取的是記錄的最新版本,讀取時還要保證其他并發事務不能修改當前記錄,會對讀取的記錄進行加鎖。對于我們日常的操作,如:select ... lock in share mode(共享鎖),select ... for update、update、insert、delete(排他鎖)都是一種當前讀。

演示:

開啟兩個客戶端,在第一個客戶端執行select * from student;

在第二個客戶端執行update操作:

此時在第一個客戶端執行select * from student;無法查詢到更新后的數據,第二個客戶端commit;后也無法查詢到更新后的語句,要讀取最新的數據,即當前讀,要執行select * from student lock in share mode;

②快照讀

前文在第一個客戶端執行select * from student;無法查詢到更新后的數據,第二個客戶端commit;后也無法查詢到更新后的語句,即為快照讀。

repeatable read:

在一個事務中第一次執行select * from student;為快照讀的地方,后面執行的select * from student為讀取前面的快照數據。

③MVCC(multi-version concurrency control)

三個隱式字段、undo log、readview

(2)MVCC-隱式字段

創建了一張表,含三個字段id、age、name,在InnoDB引擎中還會增加三個字段

使用ibd2sdi student.ibd查詢表結構

可以看到兩個隱式字段,由于這張表有主鍵,第三個隱式字段不會被自動創建

(3)MVCC-undo log

有數據如下所示:

要執行下面的事務:

首先要執行事務2,update操作,現在undo log日志中記錄更新前的數據:

然后再修改數據;

同理執行事務2:

執行事務3:

undo log版本鏈:

(4)MVCC-readview

讀取記錄由readview決定

(5)MVCC-RC級別

每一次執行快照讀時生成readview

分析事務5:

當第一次執行查詢id為30的記錄時,readview為如下所示:

由于事務2已經提交了,所以當前活躍事務為3,4,5

事務5要查詢數據,快照讀為他生成的,creator_trx_id=5

帶入db_trc_id=4,都不行,沿著版本鏈帶入db_trc_id=3,失敗

帶入=2時,滿足第二條,查詢到這條:

當第二次查詢id為30的記錄時,readview為如下所示:

依次帶入:

查詢到這條數據:

(6)MVCC-RR級別

RR隔離級別下,僅在事務第一次執行快照讀時生成readview,后續復用該readview。

事務5中,兩次查詢id為30的記錄,兩次readview都如下所示:

規則和上面一樣,兩次查詢到的為:

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

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

相關文章

MTK Linux DRM分析(二十四)- MTK mtk_drm_plane.c

一、代碼分析 mtk_drm_plane.h 和 mtk_drm_plane.c 兩個文件,并生成基于文本的函數調用圖,我將首先解析文件中的主要函數及其功能,然后根據代碼中的調用關系整理出調用圖。由于文件內容較長,我會專注于關鍵函數及其相互調用關系,并以清晰的文本形式呈現。 文件分析 1. …

滾珠導軌如何賦能精密制造?

在智能制造發展的趨勢下,新興行業對高精度、高穩定性的運動控制需求激增。作為直線傳動領域的“精密紐帶”,滾珠導軌憑借低摩擦、長壽命、高剛性優勢,廣泛應用于精密傳動領域,成為產業升級的關鍵。新能源汽車制造領域:…

醫療 AI 的 “破圈” 時刻:輔助診斷、藥物研發、慢病管理,哪些場景已落地見效?

一、引言在科技迅猛發展的當下,醫療領域正經歷著深刻變革,人工智能(AI)技術宛如一顆璀璨新星,強勢 “破圈” 闖入,為醫療行業帶來了前所未有的機遇與活力。從輔助醫生精準診斷病情,到助力藥企高…

【項目思維】編程思維學習路線(推薦)

本篇博客是一份系統性、分階段的 編程思維學習路線圖推薦,從零基礎小白到系統架構級別,幫助你全面建立和提升編程思維能力。 🚦 階段 0:思維準備(理解編程是什么) 🎯 學習目標: 理…

vue3+antd實現華為云OBS文件拖拽上傳詳解

1、文件上傳核心流程 選擇文件??:用戶通過拖拽或點擊選擇文件手動觸發上傳??:點擊"確定"按鈕后開始上傳(阻止自動上傳)??獲取上傳憑證??:從后端獲取華為云OBS的上傳配置構建表單數據??&#xff1…

Mac 開發環境與配置操作速查表

Mac 開發環境與配置操作速查表 安裝和配置 nvm / Node 安裝 Homebrew Homebrew 安裝參考文章 如果沒有VPN,不要使用此命令安裝! /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" brew --v…

【論文簡讀】MuGS

今天讀一篇ICCV 2025的文章,關注的是Generalizable Gaussian Splatting,作者來自華中科技大學。 文章鏈接:arxiv 代碼倉庫:https://github.com/EuclidLou/MuGS(摘要中的鏈接,但暫時404) 文章目…

基于SpringBoot和百度人臉識別API開發的保安門禁系統

角色: 管理員、保安 技術: Spring Boot, MyBatis, MySQL, PageHelper, Bootstrap, jQuery, JavaScript, CSS3, HTML5, JSP, 百度人臉識別API 核心功能: 小區保安門禁系統是一個基于Spring Boot技術棧開發的綜合性平臺,旨在實現小區…

抖音電商首創最嚴珠寶玉石質檢體系,推動行業規范與消費擴容

8月27日,“抖音電商開放日質檢專場”活動在廣州華林國際舉行。活動上,抖音電商首次對外介紹了質檢倉配一體化中心(QIC)的運作流程,并發布了服務升級計劃。這一行業首創的“先鑒定后發貨”模式,被認為推動了…

SpringBoot整合Spring WebFlux棄用自帶的logback,使用log4j2,并啟動異步日志處理

第一步&#xff1a;修改pom文件<!-- Spring Boot Starter WebFlux (排除默認日志) --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId><version>${spring-boot.vers…

理解虛擬 DOM:前端開發中的高效渲染利器

在前端開發中&#xff0c;我們經常聽到 虛擬 DOM&#xff08;Virtual DOM&#xff09; 這個概念。它是 React、Vue 等框架的核心機制之一&#xff0c;用來提升性能和簡化開發。那么&#xff0c;虛擬 DOM 到底是什么&#xff1f;為什么要用它&#xff1f;又是如何工作的呢&#…

GraphRAG數據可視化

GraphRAG數據可視化

vue/react項目如何跳轉到一個已經寫好的html頁面

如果是一個你copy的別人的網站&#xff0c;某些頁面是已經可以直接使用的&#xff0c;但是有些頁面需要在vue/react項目中重新二次調整加工&#xff0c;這個時候&#xff0c;就需要將html文件和vue/react項目結合&#xff0c;當某些頁面可以直接使用&#xff0c;就直接跳轉到這…

MYSQL-表的約束(下)

目錄 自增長 唯一鍵 外鍵 自增長 MySQL自增長&#xff08;Auto-Increment&#xff09; 是一種字段屬性&#xff0c;用于為表中的記錄自動生成唯一的連續整數&#xff0c;常作為主鍵或唯一標識字段使用&#xff0c;避免手動輸入重復值。 核心特性 1. 自動賦值&#xff1a…

《UE5_C++多人TPS完整教程》學習筆記44 ——《P45 傾斜與側向移動(Leaning And Strafing)》

本文為B站系列教學視頻 《UE5_C多人TPS完整教程》 —— 《P45 傾斜與側向移動&#xff08;Leaning And Strafing&#xff09;》 的學習筆記&#xff0c;該系列教學視頻為計算機工程師、程序員、游戲開發者、作家&#xff08;Engineer, Programmer, Game Developer, Author&…

使用docker搭建嵌入式Linux開發環境

文章目錄1、前言2、安裝docker3、編寫容器管理腳本4、創建容器1、前言 在日常開發全志、rk等不同平臺時&#xff0c;大多數時候只有一個編譯主機&#xff0c;但不同sdk所需要的編譯環境可能不同。所以本文將記錄使用docker為每個平臺創建獨立的開發環境。 2、安裝docker # 1…

【開題答辯全過程】以基于Android的校園跳蚤市場交易系統的設計與實現為例,包含答辯的問題和答案

個人簡介一名14年經驗的資深畢設內行人&#xff0c;語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…

【學習筆記】GB 42250-2022標準解析

隨著數字化轉型的加速推進和網絡安全威脅的日益復雜化&#xff0c;網絡安全專用產品作為保護關鍵信息基礎設施的第一道防線&#xff0c;其安全性和可靠性受到國家的高度重視。GB 42250-2022《信息安全技術 網絡安全專用產品安全技術要求》作為一項強制性國家標準&#xff0c;于…

QML開發踩坑記:從MVVM到QWidget的掙扎

如題&#xff1a;最近這一周在開發的時候被qml不友好的前端框架打敗了。首先&#xff0c;我沒深入&#xff08;系統的&#xff09;學習過前端的內容&#xff0c;就是在學習Qt的時候了解到了qwidget&#xff0c;后來發現美化不太足的樣子&#xff0c;外加AI十分推崇基于QML的MVV…

[Mysql數據庫] 知識點總結5

1. 什么是“最少權限原則”&#xff1f;答&#xff1a;應用最少權限原則就是僅為用戶授予高效地完成任務所需的權限&#xff0c;除此之外的任何權限均不能授 予&#xff0c;這可以降低用戶修改或查看&#xff08;無意或惡意&#xff09;他們無權修改或查看的數據的機率&#xf…