欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL之InnoDB存儲(chǔ)引擎中的頁(yè)用法解讀

 更新時(shí)間:2025年06月26日 09:45:56   作者:在成都搬磚的鴨鴨  
這篇文章主要介紹了MySQL之InnoDB存儲(chǔ)引擎中的頁(yè)用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

1、背景

mysql中存儲(chǔ)數(shù)據(jù)是存儲(chǔ)引擎干的事,存儲(chǔ)引擎存儲(chǔ)數(shù)據(jù)的基本單位是頁(yè),我們往數(shù)據(jù)庫(kù)插入表中的一條條記錄就是存儲(chǔ)在頁(yè)上的,今天我們就來(lái)熟悉一下頁(yè)上面有哪些內(nèi)容。

2、頁(yè)的組成

頁(yè)由7部分組成,先大概字面意思理解一下,后面再各部分詳細(xì)講解,組成圖如下:

在這里插入圖片描述

表格解釋如下:

名稱字節(jié)大小描述
文件頭部38頁(yè)的通用信息
頁(yè)頭部56頁(yè)的專有信息
最小記錄和最大記錄262個(gè)固定的行記錄
行記錄不固定存放用戶數(shù)據(jù)
空閑空間不固定未使用存放用戶數(shù)據(jù)的空間
頁(yè)目錄不固定存放槽
文件尾部8校驗(yàn)頁(yè)面是否完整

3、各部分講解

【1】文件頭部

文件頭部38個(gè)字節(jié)由8個(gè)部分組成,看表理解:

名稱字節(jié)大小描述
FIL_PAGE_SPACE_OR_CHKSUM4表空間id或校驗(yàn)和
FIL_PAGE_OFFSET4頁(yè)號(hào),當(dāng)前頁(yè)的唯一標(biāo)識(shí)
FIL_PAGE_PREV4上一個(gè)頁(yè)號(hào)唯一標(biāo)識(shí)
FIL_PAGE_NEXT4下一個(gè)頁(yè)號(hào)唯一標(biāo)識(shí)
FIL_PAGE_LSN8該頁(yè)最后一次修改對(duì)應(yīng)的redo日志序號(hào)
FIL_PAGE_TYPE2頁(yè)類型
FIL_PAGE_FILE_FLUSH_LSH8該頁(yè)被刷到磁盤的redo日志序號(hào)
FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID4歸檔日志編號(hào)或頁(yè)屬于哪個(gè)表空間

1、本文是在FIL_PAGE_TYPE為數(shù)據(jù)頁(yè)的基礎(chǔ)上進(jìn)行講解

2、FIL_PAGE_SPACE_OR_CHKSUM對(duì)于數(shù)據(jù)頁(yè)的類型含義為校驗(yàn)和,用來(lái)和文件尾部的校驗(yàn)和進(jìn)行對(duì)比

【2】頁(yè)頭部

頁(yè)頭部的56個(gè)字節(jié)由14個(gè)部分組成,看表理解:

名稱字節(jié)大小描述
PAGE_N_DIR_SLOTS2頁(yè)目錄中存儲(chǔ)槽的數(shù)量
PAGE_HEAP_TOP2頁(yè)中空閑空間地址
PAGE_N_HEAP2未標(biāo)記刪除用戶記錄 + 已標(biāo)記刪除用戶記錄 + 最小記錄 + 最大記錄
PAGE_FREE2第1條標(biāo)記為已刪除的用戶記錄地址
PAGE_GARBAGE2所有標(biāo)記為已刪除記錄占用的字節(jié)數(shù)
PAGE_LAST_INSERT2最后一條用戶記錄插入位置
PAGE_DIRECTION2最后一條用戶記錄插入方向,主鍵/unique健/隱藏列唯一鍵比上一條大就為右,反之為左
PAGE_N_RECS2未標(biāo)記為刪除的用戶記錄數(shù)
PAGE_MAX_TRX_ID8修改當(dāng)前頁(yè)的最新事務(wù)id
PAGE_LEVEL2當(dāng)前頁(yè)在B+樹(shù)中的層級(jí)
PAGE_INDEX_ID8當(dāng)前頁(yè)屬于的索引ID
PAGE_BTR_SEG_LEAF10B+樹(shù)葉子段的頭部信息
PAGE_BTR_SEG_TOP10B+樹(shù)非葉子段的頭部信息

【3】最小記錄和最大記錄

最小記錄和最大記錄2條記錄是頁(yè)中固定就存在的,最小記錄和最大記錄都是由5字節(jié)頭部信息+8字節(jié)數(shù)據(jù)組成,所以它們總共占用空間26字節(jié),最小記錄數(shù)據(jù)部分固定為’infimum’,最大記錄數(shù)據(jù)部分固定為’supremum’, 在講它之前我們先了解一下Compact行格式中頭部信息用5字節(jié)來(lái)存儲(chǔ)的行記錄信息,其組成部分如下:

名稱位大小描述
預(yù)留位1未使用
預(yù)留位1未使用
delete_mask10-記錄未刪除,1-記錄已刪除
min_rec_mask1B+樹(shù)非葉子節(jié)點(diǎn)中的最小記錄
n_owned4當(dāng)前記錄在記錄組里擁有記錄數(shù)
heap_no13當(dāng)前記錄在記錄堆中的位置
record_type3記錄類型,0-普通記錄,1-B+數(shù)非葉子節(jié)點(diǎn)記錄,2-最小記錄,3-最大記錄
next_record16指向下一條未被刪除的記錄

當(dāng)頁(yè)中沒(méi)有任何用戶記錄時(shí),最小記錄和最大記錄可以如圖表示:

在這里插入圖片描述

最小記錄中的n_owned為1表示以最小記錄結(jié)尾的分組記錄中只有一條記錄,這條記錄就是最小記錄本身,最小記錄的next_record為13代表最小記錄數(shù)據(jù)部分與下一條數(shù)據(jù)部分的偏移量,所以上圖箭頭指向最大記錄的固定數(shù)據(jù)部分,13字節(jié)大小是這樣計(jì)算的: 最小記錄固定數(shù)據(jù)部分(8) + 最大記錄頭部信息(5)

next_record之所以指向下一條記錄的數(shù)據(jù)部分是因?yàn)椋簩?duì)于用戶記錄,指向位置往左的頭部信息中還有逆序的長(zhǎng)度列表、逆序的是否為NULL列表,往右就是數(shù)據(jù)部分。

最大記錄中的n_owned為1表示以最大記錄結(jié)尾的分組記錄中只有一條記錄,這條記錄就是最大記錄本身,最大記錄的next_record為0代表沒(méi)有下一條記錄,它就是最后一條記錄。

n_owned數(shù)有這樣的定義:

  • 1、最小記錄所在分組記錄數(shù)最多只能有1條。
  • 2、最大記錄所在分組記錄數(shù)范圍為1~8條。
  • 3、用戶記錄所在分組記錄數(shù)范圍為4~8條。

【4】行記錄

行記錄講解需要根據(jù)數(shù)據(jù)來(lái)進(jìn)行理解了,我們先創(chuàng)建一張表如下:

CREATE TABLE test
(
    id INT AUTO_INCREMENT PRIMARY KEY,
    str VARCHAR(255) NOT NULL DEFAULT ''
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;

插入3條記錄:

INSERT INTO test (str)
VALUES ('AAA'),
       ('BBB'),
       ('CCC');

查看記錄:

mysql [xxx]> select * from test;
+----+-----+
| id | str |
+----+-----+
|  1 | AAA |
|  2 | BBB |
|  3 | CCC |
+----+-----+
3 rows in set (0.001 sec)

此時(shí)插入的3條記錄和最小最大記錄可以如圖表示:

在這里插入圖片描述

可以看到所有記錄通過(guò)nex_record的偏移量組成了一個(gè)鏈表,刪除其中某條記錄,就會(huì)把該條記錄的delete_mask設(shè)置為1,next_record設(shè)置為0,但是記錄依然存在,只是標(biāo)記為了刪除,這是為了后面插入新數(shù)據(jù)時(shí)可以對(duì)這部分空間進(jìn)行復(fù)用,如圖:

在這里插入圖片描述

因?yàn)槭堑?條標(biāo)記刪除的記錄,也會(huì)在頁(yè)頭部記錄這條記錄的地址,如果有多條刪除記錄,它們之間也會(huì)組成一個(gè)鏈表。

【5】空閑空間

空閑空間就是給行記錄使用的,行記錄空間增加,空閑空間就減少。

【6】頁(yè)目錄

頁(yè)目錄就是用來(lái)存儲(chǔ)槽的,槽就是一組用戶記錄中,相對(duì)頁(yè)起始位置偏移量最大的一條記錄, 這條記錄數(shù)據(jù)部分相對(duì)頁(yè)起始位置的偏移量就作為槽,槽對(duì)應(yīng)的記錄中的n_owned屬性就代表這條記錄對(duì)應(yīng)的用戶組內(nèi)有多少條記錄,槽與記錄關(guān)系可以如圖表示:

在這里插入圖片描述

最大記錄看起來(lái)雖然是在最后面,起始它是和最小記錄挨著的,所以后面記錄增加導(dǎo)致分組產(chǎn)生新增槽時(shí)相對(duì)頁(yè)起始位置的偏移量要比槽1大。

在講最小記錄和最大記錄時(shí)講過(guò)分組記錄的約束,根據(jù)這個(gè)約束行記錄分組產(chǎn)生規(guī)則如下:

1、新增記錄放到比插入記錄主鍵值大且主鍵值相隔最近的行記錄對(duì)應(yīng)的槽里,并將當(dāng)前槽對(duì)應(yīng)行記錄的n_owned屬性+1,表示該槽對(duì)應(yīng)的記錄組的記錄多了1個(gè)。

2、當(dāng)記錄組的記錄數(shù)變?yōu)?個(gè)時(shí),會(huì)將這9條記錄分為2個(gè)組,一組4個(gè)一組5個(gè),對(duì)于4條記錄的分組會(huì)將里面相對(duì)頁(yè)起始位置最大的值的行記錄的數(shù)據(jù)部分偏移量(相對(duì)頁(yè)起始位置)設(shè)置為新的槽。

查找記錄的規(guī)則如下:

1、通過(guò)二分法找到對(duì)應(yīng)的槽。

2、根據(jù)行記錄的next_record屬性找到對(duì)應(yīng)的行。

【7】文件尾部

文件尾部大小為8個(gè)字節(jié),前4個(gè)字節(jié)代表頁(yè)的校驗(yàn)和,和文件頭部的校驗(yàn)和相等就代表是一個(gè)完成的頁(yè),后4個(gè)字節(jié)代表最后一次修改當(dāng)前頁(yè)是對(duì)應(yīng)的redo日志序號(hào),這個(gè)以后再講。

4、總結(jié)

本篇文章講解了數(shù)據(jù)頁(yè)的組成,頁(yè)是存儲(chǔ)數(shù)據(jù)的基本單位;每個(gè)頁(yè)的文件頭部都會(huì)有一個(gè)上下頁(yè)號(hào),組成了一個(gè)雙向鏈表;頁(yè)中每條行記錄的next_record組成一個(gè)單項(xiàng)鏈表;InnoDB會(huì)把多條記錄分為一個(gè)組,組里的最大記錄的數(shù)據(jù)部分相對(duì)于頁(yè)面開(kāi)頭的偏移量就設(shè)置為槽,查找記錄時(shí)通過(guò)二分法查找所在的槽,再通過(guò)行記錄的next_record屬性找到對(duì)應(yīng)的記錄。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • MySql設(shè)置指定用戶數(shù)據(jù)庫(kù)查看查詢權(quán)限

    MySql設(shè)置指定用戶數(shù)據(jù)庫(kù)查看查詢權(quán)限

    這篇文章主要介紹了MySql設(shè)置指定用戶數(shù)據(jù)庫(kù)查看查詢權(quán)限,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • MYSQL導(dǎo)入導(dǎo)出命令詳解

    MYSQL導(dǎo)入導(dǎo)出命令詳解

    網(wǎng)上看了一些總結(jié)出來(lái)的資料,不知道對(duì)大家有沒(méi)有用的,有用的話也就不枉費(fèi)我一按按鈕的一片苦心了
    2007-09-09
  • MySQL導(dǎo)出sql腳本文件操作指南

    MySQL導(dǎo)出sql腳本文件操作指南

    mysql數(shù)據(jù)庫(kù)是非常常用的一種數(shù)據(jù)庫(kù),屬于中小型數(shù)據(jù)庫(kù),常用于網(wǎng)站業(yè)務(wù)和一些WEB系統(tǒng)業(yè)務(wù),下面這篇文章主要給大家介紹了關(guān)于MySQL導(dǎo)出sql腳本文件操作的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • Mysql簡(jiǎn)易索引方案講解

    Mysql簡(jiǎn)易索引方案講解

    這篇文章主要為大家介紹了Mysql索引如何實(shí)現(xiàn)更加簡(jiǎn)易的查找方案,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • 關(guān)于Mysql5.7及8.0版本索引失效情況匯總

    關(guān)于Mysql5.7及8.0版本索引失效情況匯總

    這篇文章主要介紹了關(guān)于Mysql5.7及8.0版本索引失效情況匯總,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • MySQL分區(qū)表的詳細(xì)介紹

    MySQL分區(qū)表的詳細(xì)介紹

    當(dāng)設(shè)計(jì)MySQL分區(qū)表時(shí),需要考慮以下幾個(gè)方面,分區(qū)策略、分區(qū)字段、分區(qū)數(shù)量和分區(qū)函數(shù),本文就來(lái)介紹一下MySQL分區(qū)表,感興趣的可以了解一下
    2023-10-10
  • MySQL索引背后的數(shù)據(jù)結(jié)構(gòu)及算法原理詳解

    MySQL索引背后的數(shù)據(jù)結(jié)構(gòu)及算法原理詳解

    本文以MySQL數(shù)據(jù)庫(kù)為研究對(duì)象,討論與數(shù)據(jù)庫(kù)索引相關(guān)的一些話題。特別需要說(shuō)明的是,MySQL支持諸多存儲(chǔ)引擎,而各種存儲(chǔ)引擎對(duì)索引的支持也各不相同,因此MySQL數(shù)據(jù)庫(kù)支持多種索引類型,如BTree索引,哈希索引,全文索引等等
    2016-12-12
  • MySQL中的字符替換示例詳解

    MySQL中的字符替換示例詳解

    本文介紹了 MySQL 中的兩種字符替換函數(shù):REPLACE 和 REGEXP_REPLACE,通過(guò)這兩個(gè)函數(shù)的使用,我們可以方便地進(jìn)行字符替換操作,提高數(shù)據(jù)處理的效率和準(zhǔn)確性,感興趣的朋友跟隨小編一起看看吧
    2023-06-06
  • mysql多版本并發(fā)控制MVCC的實(shí)現(xiàn)

    mysql多版本并發(fā)控制MVCC的實(shí)現(xiàn)

    這篇文章主要介紹了mysql多版本并發(fā)控制MVCC的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • MySQL字符串日期格式轉(zhuǎn)換的幾種常用方法例子解析

    MySQL字符串日期格式轉(zhuǎn)換的幾種常用方法例子解析

    這篇文章主要給大家介紹了MySQL字符串日期格式轉(zhuǎn)換的幾種常用方法例子解析,MySQL提供了多種函數(shù)來(lái)處理字符串日期格式的轉(zhuǎn)換,這些函數(shù)可以幫助用戶在不同的日期格式之間進(jìn)行轉(zhuǎn)換,以及進(jìn)行日期的加減和時(shí)間戳的轉(zhuǎn)換操作,需要的朋友可以參考下
    2024-11-11

最新評(píng)論