MySQL Internal - InnoDB存儲引擎(行結構)

来源:http://www.cnblogs.com/arbore/archive/2016/03/03/5210294.html
-Advertisement-
Play Games

InnoDB行存儲的三個組成部分(說明: F字元表示列的數量) 名稱(Name) 大小(Size) Field Start Offsets (F*1) or (F*2) bytes Extra Bytes 6 bytes Field Contents 取決於內容 1: FIELD START OFF


InnoDB行存儲的三個組成部分(說明: F字元表示列的數量)

名稱(Name) 大小(Size)
Field Start Offsets (F*1) or (F*2) bytes
Extra Bytes 6 bytes
Field Contents 取決於內容

 

 

 

 

1: FIELD START OFFSETS

指在實際數據存儲行中每一欄位(entry,實際存儲不只是包括列,還有額外信息)的位置偏移量信息列表,這個位置由原點(Origin)相對位置和下一個欄位計算而來。該列表保存的行中每一欄位的偏移信息為倒序的,也就是說行中第一欄位信息在這個列表的最後。

舉個例子:假設有三個列,第一個列的長度為1位元組,第二個為2位元組,第三個為4位元組,這種情況下,保存三個列的偏移信息分別為[1,3(1+2),7(1+2+4)],列表倒序,轉儲的Field Start Offsets的信息應該為[07,03,01].

有兩種的特殊複雜情況:

1:偏移量數字可能為一個或兩個位元組,一個位元組最多允許長度為127,最高位bit用來保存是否為NULL,"Extra Bytes"部分說明瞭偏移量為一個位元組還是兩個位元組。

2:偏移量可能有一個標誌信息,剩下的位元組空間包含兩個段,指具體的內容。(可能這些內容並不在同一個頁中,參考後面的分析)

當偏移量為一個位元組時:

1 bit = NULL

7 bit, 實際的偏移信息

當偏移量為兩個位元組時:

1 bit = NULL

1 bit = 0 內容在同一個頁中,= 1 內容在不同的頁中

14 bits = 實際的偏移量,0 ~ 16383

 

2:EXTRA BYTES

Extra Bytes為6個位元組

Name Size Description
info_bits: ?? ??
() 1 bit 未使用
() 1 bit 未使用
deleted_flag 1 bit 1:刪除標誌位(已刪除)
min_rec_flag 1 bit 1: 預定義的最小記錄
n_owned 4 bits 擁有的記錄數量
heap_no 13 bits 堆塊中索引的數據頁序列編號
n_fields 10 bits 記錄中的欄位數量 1 to 1023
1byte_offs_flag 1 bit 1:Field Start Offsets為一個位元組,否則為兩個位元組
next 16 bits 16 bits 下一個記錄的指針(System Column #1)
TOTAL 48 bits ??

 

 

 

 

 

 

 

 

 

共48 bit,6個位元組

如果需要通過位元組讀取這存儲的記錄,最關鍵的需要讀取Extra Bytes 中的byte_offs_flag位信息,需要知道1表示偏移信息為一個位元組,0表示兩個位元組

如果給定了一個相對原點(Origin),InnoDB獲取記錄開始遵循如下步驟:

-- X = n_fields,這個數字等於Field Start Offsets列表中的定義的數量

-- 如果byte_offs_flag = 0,X = X * 2,每個偏移量為兩個位元組表示的

-- X = X + 6,固定大小的Extra Bytes為6位元組

-- 記錄的開始位置當前的位置減去X

(參照FIELD CONTENTS)

 

3:FIELD CONTENTS

Field Contents部分包括了記錄的所有數據,這些欄位按照我們預定義的方式按順序存儲。

欄位與欄位沒有任何標記,記錄的結尾也沒有任何標誌。

實例:

 -- 創建一張表

CREATE TABLE T
    (FIELD1 VARCHAR(3), FIELD2 VARCHAR(3), FIELD3 VARCHAR(3))
    Type=InnoDB;

需要知道的是,InnoDB下表中的每一行有6個欄位,並不是3個,因為InnoDB在存儲的內容前自動補充的3個列("system columns"),這些列分別為 行ID(row ID,該表未定義主鍵),事務ID(transaction ID), 回滾指針(rollback pointer)。

  -- 為該表增加三條數據 

INSERT INTO T VALUES ('PP', 'PP', 'PP');
INSERT INTO T VALUES ('Q', 'Q', 'Q');
INSERT INTO T VALUES ('R', NULL, NULL);

  運行工具(Borland's TDUMP)查看二進位的事務文件信息(\mysql\data\ibdata1

Address Values in Hexadecimal

Values in ASCII

0D4280: 00 00 2D 00 84 4F 4F 4F 4F 4F 4F 4F 4F 4F 19 17

..-..OOOOOOOOO..

0D4290: 15 13 0C 06 00 00 78 0D 02 BF 00 00 00 00 04 21

......x........!

0D42A0: 00 00 00 00 09 2A 80 00 00 00 2D 00 84 50 50 50

.....*....-..PPP

0D42B0: 50 50 50 16 15 14 13 0C 06 00 00 80 0D 02 E1 00

PPP.............

0D42C0: 00 00 00 04 22 00 00 00 00 09 2B 80 00 00 00 2D

....".....+....-

0D42D0: 00 84 51 51 51 94 94 14 13 0C 06 00 00 88 0D 00

..QQQ...........

0D42E0: 74 00 00 00 00 04 23 00 00 00 00 09 2C 80 00 00

t.....#.....,...

0D42F0: 00 2D 00 84 52 00 00 00 00 00 00 00 00 00 00 00

.-..R........... 

 

 

 

 

 

 

 

 

 

 

 

 

 

做一下格式處理,添加標記:

19 17 15 13 0C 06 Field Start Offsets /* First Row */
00 00 78 0D 02 BF Extra Bytes
00 00 00 00 04 21 System Column #1
00 00 00 00 09 2A System Column #2
80 00 00 00 2D 00 84 System Column #3
50 50 Field1 'PP'
50 50 Field2 'PP'
50 50 Field3 'PP'

16 15 14 13 0C 06 Field Start Offsets /* Second Row */
00 00 80 0D 02 E1 Extra Bytes
00 00 00 00 04 22 System Column #1
00 00 00 00 09 2B System Column #2
80 00 00 00 2D 00 84 System Column #3
51 Field1 'Q'
51 Field2 'Q'
51 Field3 'Q'

94 94 14 13 0C 06 Field Start Offsets /* Third Row */
00 00 88 0D 00 74 Extra Bytes
00 00 00 00 04 23 System Column #1
00 00 00 00 09 2C System Column #2
80 00 00 00 2D 00 84 System Column #3
52 Field1 'R'

   -- "Field Start Offsets"

      參照First Row,從Extra Bytes開始的7個欄位,大小分別為6, 6, 7, 2, 2, 2,偏移信息指向了下一欄位的開始位置,16進位表示下的數字06, 0c (6+6), 13 (6+6+7), 15 (6+6+7+2), 17 (6+6+7+2+2), 19 (6+6+7+2+2+2),倒序的Field Start Offsets值分別為:[19,17,15,13,0c,06]

   -- "Extra Bytes"

      參照First Row,Extra Bytes為[00 00 78 0D 02 BF],參照EXTRA BYTES讀取跳過頭21 bit讀(n_fields),取10個bit,讀取第三個位元組最後三個個bit [000]和第四個位元組0D[00001101]的7個bit [0000110],得出的6即為欄位的數量(除去Extra Bytes),第四個位元組0D[00001101]最後bit:1表示byte_offs_flag說明偏移量為1位元組,最後的第5,6位元組02 BF,指向下一行Second Row(System Column #1)的記錄(02BF為0D42BF頁內地址),下一記錄指向了System Column #1,讀取過程遵循EXTRA BYTES末的規則。

    -- NULL列的表示

      參照Third Row,FIELD2和FIELD3為NULL,因為byte_offs_flag為1,因此,在Field Start Offsets中[94 94 14 13 0C 06]每次讀取1個位元組可表示欄位的偏移信息,這個位元組最高位為NULL標記,14 13表示1個位元組[52]的FIELD1值'R',94 14表示0位元組的FIELD2值NULL(94最高位為1表示NULL,其餘7 bit為14),94 94表示0位元組的FIELD3值NULL。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在資料庫操作中,經常有一些這樣的操作:插入諾乾條測試數據、查詢這個月的登錄情況(沒有登錄的日期不能不存在,要顯示數量為0),獲取諾乾條guid。 這些的基礎都是怎麼生成連續的一串數字 1 2 3 4 ……………… 100000。 在oracle中,我們使用start with connect by
  • 1. TokuFT file system space is really low and access is restricted 解決方法:修改tokudb_fs_reserve_percent參數,不過該參數是靜止參數,需重啟實例 具體可參考:http://www.cnblogs.com/zu
  • 資料庫概述 用自定義文件格式保存數據的劣勢 database management system,資料庫管理系統和資料庫。 不同品牌的dbms有自己的不同特點:mysql(速度快,適合網站),mssqlserver(和.net結合好),db2,oracle,access,sybase等,對開發人員來
  • 修改root密碼的方法有很多種,下麵我來給大家總結一些常用的MySQL數據修改root密碼方法,有需要瞭解或忘記root密碼的朋友可進入參考。 方法一,用mysqladmin 這裡使用了到了Mysql自帶的兩種命令mysqladmin.exe和mysql.exe,mysqladmin修改密碼的命令格
  • mysql的多實例有兩種方式可以實現,兩種方式各有利弊。第一種是使用多個配置文件啟動不同的進程來實現多實例,這種方式的優勢邏輯簡單,配置簡單,缺點是管理起來不太方便。第二種是通過官方自帶的mysqld_multi使用單獨的配置文件來實現多實例,這種方式定製每個實例的配置不太方面,優點是管理起來很方便
  • 原創文章,轉載必需註明出處:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/sqlserver-codeblock/ 一、go語句 Go語句是SqlServer中用來表示當前代碼塊結束提交並確認結果的語句。 Go語句不能和其他Sql
  • 【OEM】OEM安裝維護 一.1 BLOG文檔結構圖 一.2 前言部分 一.2.1 導讀和註意事項 各位技術愛好者,看完本文後,你可以掌握如下的技能,也可以學到一些其它你所不知道的知識,~O(∩_∩)O~: ① oem安裝和維護 ② OEM各種錯誤解決 Tips: ① 若文章代碼格式有錯亂,推薦使用...
  • 3月12日廣州開源社區巡講活動 歡迎大家報名參加
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...