04 mysql innodb record

前言?

最近看到了 何登成 大佬的 "深入MySQL源碼 -- Step By Step" 的 pdf 呵呵 似乎是找到了一些 方向?

之前對于 mysql 方面的東西, 更多的僅僅是簡單的使用[業務中的各種增刪改查], 以及一些面試題的背誦?

這里會參照?MySQL Internals Manual?來大致的看一下 innodb 里面的 record 的存儲相關, 這些是深入了解 mysql 的基礎?

我們這里主要是會了解一下兩種?RowFormat : Redundant 和 Compact?

本文內容對應的是?mysql調試的一些基礎方法 里面的?查看一下 rec 的數據信息

MySQL Internals Manual?-?22.1?InnoDB Record Structure

以下截圖參照自?MySQL Internals Manual?

這里的說明是基于?RowFormat -?Redundant?

總的來說一個 record 分成了三個部分 : 各個字段的偏移(Field Start Offsets), 元數據信息(Extra Bytes), 記錄信息(Field Contents)?

Field Start Offsets : 描述的是 record 中的各個字段在?Field Contents 中的偏移, 以此偏移可以確認各個字段的數據信息?

Extra Bytes : 描述的是?record 的元數據, 包括了 刪除標記, minRecord標記, 字段數量, "Field Start Offsets" 的單位, 記錄編號, 下一個記錄的偏移 等等信息?

Field Contents : 里面存儲的是具體的數據信息?

22.1.1.3?FIELD CONTENTS 里面介紹了一個實例的案例, 剖析一個實際的記錄在內存中的數據分布情況, 以及拆解每一個字節的邏輯意義, 可以移步文檔看一下, 這里就不截圖了, 請自行查閱文檔?

源碼中的說明 remOrec.cc |?remOrec.ic |?remOrec.h

我們再來根據源碼中的注釋結合 來看一下?

里面注釋寫的相當詳盡, 因此 建議多讀注釋, 以方便理解?

"深入MySQL源碼 -- Step By Step" 里面也提到了 "不放過源碼中的每一處注釋"?

RowFormat -?Redundant?

注釋里面描述的內容 和 上面 MySQL Internals Manual?-?22.1?InnoDB Record Structure 一致?

Extra Bytes 的結構信息?

RowFormat -?Compact?

注釋里面描述的內容 就是 Compact 的 RowFormat 的格式了,?MySQL Internals Manual?上面我沒有找到?

總的來說一個 record 分成了三個部分 : 各個字段的偏移(Field Start Offsets), 元數據信息(Extra Bytes), 記錄信息(Field Contents)?

Field Start Offsets : 描述的是 record 中的各個長度可變字段在?Field Contents 中的偏移, table元數據中固定字段偏移 結合 此偏移 可以確認所有字段的偏移, 進而可以確認各個字段的數據信息?

Extra Bytes : 描述的是?record 的元數據, 包括了 null字段標記, 刪除標記, minRecord標記, 記錄編號, 下一個記錄的偏移?等等信息?

Field Contents : 里面存儲的是具體的數據信息?

Extra Bytes 的結構信息?

RowFormat -?Redundant 實際案例剖析?

# ROW_FORMAT = Redundant 的內存情況
(lldb) x 0x12c694000 -c 0x100
0x12c694000: 1c 18 8c aa 00 00 00 03 ff ff ff ff ff ff ff ff  ...�....��������
0x12c694010: 00 00 00 00 00 1a b2 d5 45 bf 00 00 00 00 00 00  ......��E�......
0x12c694020: 00 00 00 00 00 07 00 02 00 c6 00 04 00 00 00 00  .........�......
0x12c694030: 00 ad 00 02 00 01 00 02 00 00 00 00 00 00 00 00  .�..............
0x12c694040: 00 00 00 00 00 00 00 00 00 17 00 00 00 07 00 00  ................
0x12c694050: 00 02 00 f2 00 00 00 07 00 00 00 02 00 32 08 01  ...�.........2..
0x12c694060: 00 00 03 00 88 69 6e 66 69 6d 75 6d 00 09 03 00  .....infimum....
0x12c694070: 08 03 00 00 73 75 70 72 65 6d 75 6d 00 1a 15 11  ....supremum....
0x12c694080: 0a 04 00 00 10 0b 00 ad 80 00 00 01 00 00 00 00  .......�........
0x12c694090: 3b 07 87 00 00 01 3a 01 10 80 00 00 1c 6a 65 72  ;.....:......jer
0x12c6940a0: 72 79 19 15 11 0a 04 00 00 18 0b 00 74 80 00 00  ry..........t...
0x12c6940b0: 02 00 00 00 00 3b 08 88 00 00 01 3e 01 10 80 00  .....;.....>....
0x12c6940c0: 00 16 6c 75 63 79 00 00 00 00 00 00 00 00 00 00  ..lucy..........
0x12c6940d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x12c6940e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x12c6940f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................# 0x12c694050
0x12c694050: 00 02 00 f2 00 00 00 07 00 00 00 02 00 32 08 01  ...�.........2..
0x12c694060: 00 00 03 00 88 69 6e 66 69 6d 75 6d 00 09 03 00  .....infimum....
0x12c694070: 08 03 00 00 73 75 70 72 65 6d 75 6d 00 1a 15 11  ....supremum....
0x12c694080: 0a 04 00 00 10 0b 00 ad 80 00 00 01 00 00 00 00  .......�........
0x12c694090: 3b 07 87 00 00 01 3a 01 10 80 00 00 1c 6a 65 72  ;.....:......jer
0x12c6940a0: 72 79 19 15 11 0a 04 00 00 18 0b 00 74 80 00 00  ry..........t...
0x12c6940b0: 02 00 00 00 00 3b 08 88 00 00 01 3e 01 10 80 00  .....;.....>....
0x12c6940c0: 00 16 6c 75 63 79 00 00 00 00 00 00 00 00 00 00  ..lucy..........# infimum = PAGE_OLD_INFIMUM = 0x65
08 : offset of `infimum`
01 : deleted_flag = 0, min_rec_flag = 0, n_owned = 1
00 00 03 : heap_no = 0, n_fields = 1, 1byte_offs_flag = 1
00 88 : next record pointer -> jerry
69 6e 66 69 6d 75 6d 00 : infimum# supremum = PAGE_OLD_SUPREMUM = 0x74
09 : offset of `supremum`
03 : deleted_flag = 0, min_rec_flag = 0, n_owned = 3
00 08 03 : heap_no = 1, n_fields = 1, 1byte_offs_flag = 1
00 00 : next record pointer -> self
73 75 70 72 65 6d 75 6d 00 : supremum# record jerry : 0x12c694088 # 格式為 redundant row format
1a 15 11 0a 04 : field offset of id, trx_id, poll_ptr, age, name
00 : deleted_flag = 0, min_rec_flag = 0, n_owned = 0
00 10 0b : heap_no = 2, n_fields = 5, 1byte_offs_flag = 1
00 ad : next record offset -> record lucyid = 80 00 00 01 = 1
trx_id = 00 00 00 00 3b 07 = 15111
poll_ptr = 87 00 00 01 3a 01 10
age = 80 00 00 1c = 28
name = 6a 65 72 72 79 = jerry# record lucy : 0x12c6940ad # 格式為 redundant row format
19 15 11 0a 04 : field offset of id, trx_id, poll_ptr, age, name
00 : deleted_flag = 0, min_rec_flag = 0, n_owned = 0
00 18 0b : heap_no = 3, n_fields = 5, 1byte_offs_flag = 1
00 74 : next record offset -> supremumid = 80 00 00 02 = 2
trx_id = 00 00 00 00 3b 08 = 15112
poll_ptr = 88 00 00 01 3e 01 10
age = 80 00 00 16 = 22
name = 6c 75 63 79 = lucy

RowFormat - Compact?實際案例剖析?

# user 對應的數據 當前頁的數據信息, 拆解
(lldb) x 0x1286cc000 -c 0x120
0x1286cc000: 10 aa fb 30 00 00 00 03 ff ff ff ff ff ff ff ff  .��0....��������
0x1286cc010: 00 00 00 00 00 1a a2 7d 45 bf 00 00 00 00 00 00  ......�}E�......
0x1286cc020: 00 00 00 00 00 06 00 02 00 b9 80 04 00 00 00 00  .........�......
0x1286cc030: 00 a0 00 02 00 01 00 02 00 00 00 00 00 00 00 00  .�..............
0x1286cc040: 00 00 00 00 00 00 00 00 00 16 00 00 00 06 00 00  ................
0x1286cc050: 00 02 00 f2 00 00 00 06 00 00 00 02 00 32 01 00  ...�.........2..
0x1286cc060: 02 00 1c 69 6e 66 69 6d 75 6d 00 03 00 0b 00 00  ...infimum......
0x1286cc070: 73 75 70 72 65 6d 75 6d 05 00 00 00 10 00 21 80  supremum......!.
0x1286cc080: 00 00 01 00 00 00 00 2b 07 04 00 00 01 56 04 7b  .......+.....V.{
0x1286cc090: 80 00 00 1c 6a 65 72 72 79 04 00 00 00 18 ff d0  ....jerry.....��
0x1286cc0a0: 80 00 00 02 00 00 00 00 35 04 83 00 00 01 36 01  ........5.....6.
0x1286cc0b0: 10 80 00 00 16 6c 75 63 79 00 00 00 00 00 00 00  .....lucy.......
0x1286cc0c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x1286cc0d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x1286cc0e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x1286cc0f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x1286cc100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
0x1286cc110: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................# 0x1286cc050
0x1286cc050: 00 02 00 f2 00 00 00 06 00 00 00 02 00 32 01 00  ...�.........2..
0x1286cc060: 02 00 1c 69 6e 66 69 6d 75 6d 00 03 00 0b 00 00  ...infimum......
0x1286cc070: 73 75 70 72 65 6d 75 6d 05 00 00 00 10 00 21 80  supremum......!.
0x1286cc080: 00 00 01 00 00 00 00 2b 07 04 00 00 01 56 04 7b  .......+.....V.{
0x1286cc090: 80 00 00 1c 6a 65 72 72 79 04 00 00 00 18 ff d0  ....jerry.....��
0x1286cc0a0: 80 00 00 02 00 00 00 00 35 04 83 00 00 01 36 01  ........5.....6.
0x1286cc0b0: 10 80 00 00 16 6c 75 63 79 00 00 00 00 00 00 00  .....lucy.......# infimum = PAGE_NEW_INFIMUM = 0x63
# infimum : 0x1286cc063
0x0 : delete_flag & min_rec_flag
0x1 : number of records owned by the record
0b 0000 0000 0000 0 = 0 = order number of this record
0b 010 = infimum
0x 00 1c = next record offset -> jerry
69 6e 66 69 6d 75 6d 00 = infimum# supremum = PAGE_NEW_SUPREMUM = 0x70
# supremum : 0x1286cc070
0x0 : delete_flag & min_rec_flag
0x3 : number of records owned by the record
0b 0000 0000 0000 1 = 1 = order number of this record
0b 011 = supremum
0x 00 00 = next record offset -> self
73 75 70 72 65 6d 75 6d = supremum# record jerry : 0x1286cc07f # 格式為 compact row format
0x05 : lengthOf('jerry')
0x00 = nulls
0x0 : delete flag
0x0 : number of records owned by the record
0b 0000 0000 0001 0 = 2 = order number of this record
0b 000 = conventional
0x 00 21 : next record offset -> record lucyrec = 0x80
id = 0x 80 00 00 01 = 1
trx_id = 0x 00 00 00 00 2b 07 = 11015
poll_ptr = 0x 04 00 00 01 56 04 7b
age = 0x 80 00 00 1c = 28
name = 6a 65 72 72 79 = jerry# record lucy : 0x1286cc0a0 # 格式為 compact row format
0x04 : lengthOf('lucy')
0x00 = nulls
0x0 : delete flag
0x0 : number of records owned by the record
0b 0000 0000 0001 1 = 3 = order number of this record
0b 000 = conventional
0x ff d0 : next record offset -> supremumrec = 0x80
id = 0x 80 00 00 02 = 2
trx_id = 0x 00 00 00 00 35 04 = 13572
poll_ptr = 0x 83 00 00 01 36 01 10
age = 0x 80 00 00 16 = 22
name = 6c 75 63 79 = lucy

完?

參考

MySQL Internals Manual

深入MySQL源碼 -- Step By Step

mysql調試的一些基礎方法

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

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

相關文章

通過matlab對比music,mvdr以及tdoa三種定位算法的性能

目錄 1.算法運行效果圖預覽 2.算法運行軟件版本 3.部分核心程序 4.算法理論概述 4.1 MUSIC(Multiple Signal Classification) 4.2 MVDR(Minimum Variance Distortionless Response) 4.3 TDOA(Time Difference o…

開發一個RISC-V上的操作系統(七)—— 硬件定時器(Hardware Timer)

目錄 往期文章傳送門 一、硬件定時器 硬件實現 軟件實現 二、上板測試 往期文章傳送門 開發一個RISC-V上的操作系統(一)—— 環境搭建_riscv開發環境_Patarw_Li的博客-CSDN博客 開發一個RISC-V上的操作系統(二)—— 系統引導…

AD域機器KMS自動激活

1、打開AD域控,點擊DNS管理 2、創建其它記錄 3、選擇服務位置 SRV 4、輸入相關信息 服務:_VLMCS協議:_TCP權重:100端口號:1688KMS服務器地址:10.3.0.211 5、成功,這時域內主機重啟后&#xff0…

騰訊云CVM服務器2核2g1m帶寬支持多少人訪問?

騰訊云2核2g1m的服務器支持多少人同時訪問?2核2g1m云服務器短板是在1M公網帶寬上,騰訊云服務器網以網站應用為例,當大規模用戶同時訪問網站時,很大概率會卡在公網帶寬上,所以壓根就談不上2核2G的CPU內存計算性能是否夠…

sql 執行的順序

在執行 SQL 查詢時,通常會按照以下順序進行處理: FROM 子句:指定要查詢的表或視圖。WHERE 子句:篩選滿足特定條件的行。GROUP BY 子句:將結果按照指定的列進行分組。HAVING 子句:篩選滿足特定條件的分組。…

燒寫PYNQ鏡像到SD卡

一,安裝 Win32diskimager 首先將Micro SD卡插入讀卡器的卡槽中,然后再將讀卡器插入計算機USB接口,此時計算機將會識別到插入的可移動磁盤。雙擊打開Win32DiskImager-1.0.0.zip 壓縮文件,里面win32diskimager-1.0.0-install.exe文…

Postman

Postman 簡介下載安裝 簡介 Postman 是一款用于測試和開發 API(應用程序編程接口)的工具,它提供了用戶友好的界面和豐富的功能,幫助開發者輕松地創建、測試、調試和文檔化各種類型的 API。無論是在構建 Web 應用、移動應用還是其…

“深入解析Maven:安裝、創建項目和依賴管理的完全指南“

目錄 引言Maven的安裝創建Maven項目之前的裝備工作Eclipse創建新的Maven項目項目依賴管理 總結 引言 Maven是一個流行的項目管理工具,被廣泛用于Java項目的構建、依賴管理和部署。它提供了一種簡單而強大的方式來管理項目的各個方面,使開發人員能夠更專…

LeetCode 1631. Path With Minimum Effort【最小瓶頸路;二分+BFS或DFS;計數排序+并查集;最小生成樹】1947

本文屬于「征服LeetCode」系列文章之一,這一系列正式開始于2021/08/12。由于LeetCode上部分題目有鎖,本系列將至少持續到刷完所有無鎖題之日為止;由于LeetCode還在不斷地創建新題,本系列的終止日期可能是永遠。在這一系列刷題文章…

阿里云PolarDB數據庫倚天ARM架構詳細介紹

阿里云云原生數據庫PolarDB MySQL版推出倚天ARM架構,倚天ARM架構規格相比X86架構規格最高降價45%,PolarDB針對自研倚天芯片,從芯片到數據庫內核全鏈路優化,助力企業降本增效。基于阿里云自研的倚天服務器,同時在數據庫…

誰能講清楚Spark之Spark系統架構

### 整體架構概述 Spark與Hadoop MapReduce的結構類似,Spark也采用Master-Worker結構。如果一個Spark集群由4個節點組成,即1個Master節點和3個Worker節點,那么在部署Standalone版本后,Spark部署的系統架構圖如圖2.1所示。簡單來說,Master節點負責管理應用和任務,…

【0day】復現廣聯達-Linkworks 協同辦公管理平臺GetUserByUserCode接口存在SQL注入漏洞

目錄 一、漏洞描述 二、影響版本 三、資產測繪 四、漏洞復現 一、漏洞描述 廣聯達科技股份有限公司成立于1998年,以建設工程領域專業應用為核心基礎支撐,以產業大數據、產業新金融等為增值服務的數字建筑平臺服務商。廣聯達-Linkworks 協同辦公管理平臺GetUserByUserC…

pytest fixture 用于teardown工作

fixture通過scope參數控制setup級別,setup作為用例之前前的操作,用例執行完之后那肯定也有teardown操作。這里用到fixture的teardown操作并不是獨立的函數,用yield關鍵字呼喚teardown操作。 舉個例子: 輸出: 說明&…

掌握Python的X篇_37_類的實例化、類方法

上篇我們已經學習了python中的類,并且學習到可以通過class關鍵字定義類,而類的最基本特性就是它是一個名稱空間,本篇將會學習類的實例化。 文章目錄 1. 類的實例化1.1__init__函數1.2 實例化流程 2. 類方法與成員 1. 類的實例化 上篇中新定義…

二十二、策略模式

目錄 1、項目需求2、傳統方案解決鴨子問題的分析和代碼實現3、傳統方式實現存在的問題分析和解決方案4、策略模式基本介紹5、使用策略模式解決鴨子問題6、策略模式的注意事項和細節7、策略模式的使用場景 以具體項目來演示為什么需要策略模式,策略模式的優點&#x…

貝銳蒲公英:快速搭建連鎖門店監控體系,賦能企業高效管理

隨著國民生活水平的提高和零售場景的變革,消費者對于餐飲類目的消費支出不斷增加,線下社區生鮮商超作為下沉市場最主要的消費場景之一,蘊藏著巨大價值機會。 對于線下連鎖生鮮超市而言,連鎖門店多、員工多,門店管理時會…

ubuntu磁盤管理

show partition information 掛載設備在這 顯示文件系統信息 build file system mkfs -t ext4 /dev/nvme0n1p4命令作用:將/dev/nvme0n1p4 格式化為 ext4 建立交換分區 mkswap -c -v1 /dev/nvme0n1p4 102400-c:check -v1:新版交換分區 -v0&…

安裝PaddleDetection-2.6.0版本-筆記

安裝PaddleDetection-2.6.0版本-筆記 一、第一步先激活環境 conda activate base conda activate base安裝完paddleDetection后要關閉conda激活環境 conda deactivate conda deactivate二、安裝PaddleDetection2.6.0版本 #pip install PaddleDet2.6.0 #切換版本可安裝pip i…

gitblit windows部署

1.官網下載 往死慢,我是從百度找的1.9.1,幾乎就是最新版 http://www.gitblit.com/ 2.解壓 下載下來是一個zip壓縮包,直接解壓即可 3.配置 3.1.配置資源庫路徑 找到data文件下的gitblit.properties文件,用Notepad打開 **注意路…

詳解編譯過程(編譯+鏈接)

翻譯環境: 編譯(編譯器): 1.預編譯(預處理): 最終生成test.i文件 【命令】:gcc test.c -E -O test.i 【包含過程】: 1.頭文件的包含 2.注釋的刪除 3.#define定義…