最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL之InnoDB存儲引擎中的頁用法解讀

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

1、背景

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

2、頁的組成

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

在這里插入圖片描述

表格解釋如下:

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

3、各部分講解

【1】文件頭部

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

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

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

2、FIL_PAGE_SPACE_OR_CHKSUM對于數(shù)據(jù)頁的類型含義為校驗和,用來和文件尾部的校驗和進行對比

【2】頁頭部

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

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

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

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

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

當頁中沒有任何用戶記錄時,最小記錄和最大記錄可以如圖表示:

在這里插入圖片描述

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

next_record之所以指向下一條記錄的數(shù)據(jù)部分是因為:對于用戶記錄,指向位置往左的頭部信息中還有逆序的長度列表、逆序的是否為NULL列表,往右就是數(shù)據(jù)部分。

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

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

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

【4】行記錄

行記錄講解需要根據(jù)數(shù)據(jù)來進行理解了,我們先創(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)

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

在這里插入圖片描述

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

在這里插入圖片描述

因為是第1條標記刪除的記錄,也會在頁頭部記錄這條記錄的地址,如果有多條刪除記錄,它們之間也會組成一個鏈表。

【5】空閑空間

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

【6】頁目錄

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

在這里插入圖片描述

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

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

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

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

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

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

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

【7】文件尾部

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

4、總結(jié)

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

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

相關(guān)文章

  • MySQL中ALTER?LOGFILE?GROUP?語句的具體使用

    MySQL中ALTER?LOGFILE?GROUP?語句的具體使用

    ALTER LOGFILE GROUP語句用于修改重做日志組的配置,本文主要介紹了MySQL中ALTER?LOGFILE?GROUP?語句的具體使用,需要的朋友們下面隨著小編來一起學習學習吧
    2024-07-07
  • MySQL 集群遷移到 Kubernetes操作步驟

    MySQL 集群遷移到 Kubernetes操作步驟

    這篇文章主要為大家介紹了MySQL 集群遷移到 Kubernetes使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • mysql查看,創(chuàng)建,授權(quán),刪除用戶的實現(xiàn)方式

    mysql查看,創(chuàng)建,授權(quán),刪除用戶的實現(xiàn)方式

    這篇文章主要介紹了mysql查看,創(chuàng)建,授權(quán),刪除用戶的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • MySQL用limit方式實現(xiàn)分頁的實例方法

    MySQL用limit方式實現(xiàn)分頁的實例方法

    在本篇文章中小編給大家整理了一篇關(guān)于MySQL用limit方式實現(xiàn)分頁的實例方法,有需要的朋友們可以參考學習下。
    2020-01-01
  • MySQL數(shù)據(jù)庫設(shè)計之利用Python操作Schema方法詳解

    MySQL數(shù)據(jù)庫設(shè)計之利用Python操作Schema方法詳解

    這篇文章主要介紹了MySQL數(shù)據(jù)庫設(shè)計之利用Python操作Schema方法詳解,還是比較不錯的,這里分享給大家,供需要的朋友參考。
    2017-11-11
  • mysql 8.0.17 安裝圖文教程

    mysql 8.0.17 安裝圖文教程

    這篇文章主要為大家詳細介紹了mysql 8.0.17 安裝配置方法圖文教程,文中安裝步驟介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • window下mysql 8.0.15 winx64安裝配置方法圖文教程

    window下mysql 8.0.15 winx64安裝配置方法圖文教程

    這篇文章主要為大家詳細介紹了window下mysql 8.0.15 winx64安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • MySQL關(guān)鍵字問題分析與解決方案

    MySQL關(guān)鍵字問題分析與解決方案

    在實際開發(fā)中,我們常常會遇到由于SQL語法錯誤導致的數(shù)據(jù)庫操作應(yīng)用不能正常運行的情況,其中,使用了MySQL關(guān)鍵字作為表名或字段名,而沒有邏輯地處理,帶來的問題最為常見,本文將從一個實際案例出發(fā),深入分析關(guān)鍵字問題及其解決方案,并提供進一步優(yōu)化與避免方案
    2024-12-12
  • mysql添加索引反而速度變慢的問題

    mysql添加索引反而速度變慢的問題

    這篇文章主要介紹了mysql添加索引反而速度變慢的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Mysql事務(wù)索引知識匯總

    Mysql事務(wù)索引知識匯總

    這篇文章主要介紹了Mysql事務(wù)索引知識匯總,mysql事務(wù)是用于處理操作量大、復雜性高的數(shù)據(jù),索引能加快數(shù)據(jù)庫的查詢速度并高效獲取指定的數(shù)據(jù),下文相關(guān)詳細內(nèi)容,需要的小伙伴可以參考一下
    2022-03-03

最新評論

六盘水市| 永清县| 南通市| 广汉市| 景谷| 盘锦市| 东台市| 宁津县| 莱芜市| 清丰县| 大冶市| 博兴县| 长汀县| 平阳县| 准格尔旗| 固阳县| 桃园市| 甘谷县| 台东市| 乌拉特中旗| 延安市| 疏勒县| 九寨沟县| 孟连| 年辖:市辖区| 托克逊县| 宜宾县| 饶平县| 启东市| 禄丰县| 清新县| 建昌县| 丰都县| 建平县| 邛崃市| 苗栗县| 梓潼县| 桐城市| 商城县| 务川| 恩平市|