深入理解InnoDB(1)—行的存儲結構

1.InnoDB頁的簡介

頁(Page)是 Innodb 存儲引擎用于管理數據的最小磁盤單位。常見的頁類型有數據頁、Undo 頁、系統頁、事務數據頁等

2.InnoDB行的存儲格式

我們插入MySQL的記錄在InnoDB中可能以4中行格式存儲,分別是Compact、Redundant、Dynamic和Compressed行格式,我們可以在創建或修改表的語句中指定我們想要的行格式

CREATE TABLE 表名 (列的信息) ROW_FORMAT=行格式名稱ALTER TABLE 表名 ROW_FORMAT=行格式名稱

2.1 COMPACT行格式

Compact行記錄是在MySQL5.0中引入的,為了高效的存儲數據,簡單的說,就是為了讓一個頁(Page)存放的行數據越多,這樣性能就越高

一條完整的記錄被分為記錄的額外信息記錄的真實數據兩大部分

2.1.1 記錄的額外信息

這些額外信息分為3類,分別是變長字段長度列表、NULL值列表和記錄頭信息。

image.png

2.1.1.1 變長字段長度列表

逆序記錄每一個列的長度,如果列的長度小于 255 字節,則使用一個字節,否則使用 2 個字節。該字段的實際長度取決于列數和每一列的長度,因此是變長的

2.1.1.2 NULL值列表

一個字節,表示該行是否有 NULL 值。注意:此處需要注意固定長度 CHAR 數據類型和變長 VCHAR 數據類型在 Compact 記錄下為 NULL 時不占用任何存儲空間。

2.1.1.3 記錄頭信息

用于描述記錄的記錄頭信息,它是由固定的5個字節組成。5個字節也就是40個二進制位,不同的位代表不同的意思,其中 next_record 記錄了下一條記錄的相對位置,一個頁中的所有記錄使用這個字段形成了一條單鏈表。

2.1.2 記錄的真實數據

MySQL會為每個記錄默認的添加一些列,除了記錄每一列對應的數據外,還有隱藏列,它們分別是 Transaction ID、Roll Pointer 以及 row_id(當沒有指定主鍵)

2.1.2.1 row_id

當用戶沒有設置主鍵,并且沒有unique屬性時,innoDB會隱式的生成一個row_id,作為主鍵

2.1.2.2 transaction_id 和 roll_pointer

用來記錄當前記錄的事務號,用于可重復讀隔離級別的樂觀鎖實現

2.2 Redundant行格式

MySQL5.0之前的行記錄格式:
image.png

2.2.1 字段長度偏移列表

與 Compact 中的變長字段長度列表相同的是它們都是按照列的逆序順序設置值的,不同的是字段長度偏移列表記錄的是偏移量,每一次都需要加上上一次的偏移,同時對于 CHAR 的 NULL 值,會直接按照最大空間記錄,而對于 VCHAR 的 NULL 值不占用任何存儲空間。

與compact行格式的不同在于:

  • 存儲的是所有屬性的長度
  • 長度是通過兩個相鄰偏移量的差計算得出的
  • 使用了每個列對應偏移量的第一位作為NULL比特位來標記空值,并且對于真實記錄為NULL的定長字段也要使用0比特填充,變長則不用
  • 對于char(M)來說,即使使用變長字符集,通通按照字符集的最大字符長度來分配空間

2.2.2 記錄頭信息

和compact的大致相同

行溢出數據

我們知道數據頁的大小是 16KB,Innodb 存儲引擎保證了每一頁至少有兩條記錄,當行記錄的長度沒有超過行記錄最大長度時,所有數據都會存儲在當前頁。如果一頁當中的記錄過大,會截取前 768 個字節存入頁中,其余的放入 BLOB Page。
然后記錄的真實數據處用20個字節存儲指向這些頁的地址(當然這20個字節中還包括這些分散在其他頁面中的數據的占用的字節數),從而可以找到剩余數據所在的頁

image.png

2.3 Dynamic和Compressed行格式

InnoDB1.0x開始引入心的文件格式(file format,用戶可以理解位新的頁格式)——Barracuda,這個新的格式擁有兩種新的行記錄格式:Compressed和Dynamic。
新的兩種記錄格式對于存放BLOB中的數據采用了完全的行溢出的方式

image.png

  • Dynamic行格式,列存儲是否放到off-page頁,主要取決于行大小,他會把行中最長的一列放到off-page,直到數據頁能存放下兩行。TEXT或BLOB列<=40bytes時總是存在于數據頁。這種方式可以避免compact那樣把太多的大列值放到B-tree Node(數據頁中只存放20個字節的指針,實際的數據存放在Off Page中,之前的Compact 和 Redundant 兩種格式會存放768個字前綴字節)。

  • Compressed物理結構上與Dynamic類似,Compressed行記錄格式的另一個功能就是存儲在其中的行數據會以zlib的算法進行壓縮,因此對于BLOB、TEXT、VARCHAR這類大長度數據能夠進行有效的存儲(減少40%,但對CPU要求更高)。

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

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

相關文章

做嵌入式的必須學Android嗎

做嵌入式的必須學Android嗎Android方向適合哪些人呢&#xff1f;適合那些已經在自己領域有了一定的工作經驗的人&#xff0c;適合作為自己的拓展&#xff0c;適合提升自己的能力&#xff0c;譬如說已經做三年Linux驅動&#xff0c;就可以嘗試拓展去做Android驅動首先從技術角度…

test4

test4 轉載于:https://www.cnblogs.com/Forever77/p/11441980.html

boltzmann_推薦系統系列第7部分:用于協同過濾的Boltzmann機器的3個變體

boltzmannRecSys系列 (RecSys Series) Update: This article is part of a series where I explore recommendation systems in academia and industry. Check out the full series: Part 1, Part 2, Part 3, Part 4, Part 5, Part 6, and Part 7.更新&#xff1a; 本文是我探索…

.net 初學者_在此初學者課程中學習使用TensorFlow 2.0開發神經網絡

.net 初學者Learn how to use TensorFlow 2.0 in this full video course from Tech with Tim. This course will show you how to create neural networks with Python and TensorFlow 2.0.在Tech與Tim的完整視頻課程中&#xff0c;學習如何使用TensorFlow 2.0。 本課程將向您…

AndroidStudio怎樣導入library項目開源庫 - 轉

https://jingyan.baidu.com/article/1974b2898917aff4b1f77415.html轉載于:https://www.cnblogs.com/EasyLive2006/p/7477719.html

深入理解InnoDB(2)—頁的存儲結構

1. 記錄頭信息 上一篇博客說到每行記錄都會有記錄頭信息&#xff0c;用來記錄每一行的一些屬性 Compact行記錄的記錄頭信息為例 1.1 delete_mask 這個屬性標記著當前記錄是否被刪除&#xff0c;占用1個二進制位&#xff0c;值為0的時候代表記錄并沒有被刪除&#xff0c;為1的…

PHP中的命名空間

1. PHP中的命名空間是什么&#xff1f; 官方解釋在此&#xff1a; 命名空間概述 命名空間用一句話說&#xff0c;就是&#xff1a;把 類、函數、變量 等放到邏輯子文件夾中去&#xff0c;以避免命名沖突。 注&#xff1a;命名空間跟實際代碼文件在文件系統中的路徑沒有任何關系…

pandas 入門

pandas簡介&#xff1a;pandas包含的數據結構和數據處理工具的設計使得利用進行數據清洗和數據分析非常快捷&#xff1b;與numpy的區別&#xff0c;pandas用來處理表格型或異質型數據的&#xff0c;而numpy更適合處理同質型的數值類數據。 1、Series簡介 1、Series是一種一維的…

傳智播客軟件測試第一期_播客:冒險如何推動一位軟件工程師的職業發展

傳智播客軟件測試第一期On this weeks episode of the freeCodeCamp podcast, Abbey chats with developer and wearer of many hats Princiya about how she changed careers, moved to Berlin, and worked her way up to a lead role.在本周的freeCodeCamp播客節目中&#xf…

爬蟲神經網絡_股市篩選和分析:在投資中使用網絡爬蟲,神經網絡和回歸分析...

爬蟲神經網絡與AI交易 (Trading with AI) Stock markets tend to react very quickly to a variety of factors such as news, earnings reports, etc. While it may be prudent to develop trading strategies based on fundamental data, the rapid changes in the stock mar…

Promise 原理解析與實現(遵循Promise/A+規范)

1.什么是Promise? Promise是JS異步編程中的重要概念&#xff0c;異步抽象處理對象&#xff0c;是目前比較流行Javascript異步編程解決方案之一 2.對于幾種常見異步編程方案 回調函數事件監聽發布/訂閱Promise對象這里就拿回調函數說說 1.對于回調函數 我們用Jquery的ajax獲取數…

php 數據訪問練習:投票頁面

<!--投票界面--> <html> <head> <title></title> <meta charset"UTF-8"/> <link rel"stylesheet" type"text/css" href"bootstrap.min.css"/> <script src"bootstrap.min.js"…

深入理解InnoDB(3)—索引的存儲結構

1. 索引的各種存儲結構及其優缺點 1.1 二叉樹 優點&#xff1a; 二叉樹是一種比順序結構更加高效地查找目標元素的結構&#xff0c;它可以從第一個父節點開始跟目標元素值比較&#xff0c;如果相等則返回當前節點&#xff0c;如果目標元素值小于當前節點&#xff0c;則移動到左…

有抱負/初級開發人員的良好習慣-避免使用的習慣

When youre learning to code, it can be easy to pick up some nasty habits along the way. Here are some tips to avoid common bad habits, and the good habits to keep in mind.當您學習編碼時&#xff0c;很容易在此過程中養成一些討厭的習慣。 這里有一些技巧&#xf…

業精于勤荒于嬉---Go的GORM查詢

查詢 //通過主鍵查詢第一條記錄 db.First(&user)SELECT * FROM users ORDER BY id LIMIT 1;// 隨機取一條記錄 db.Take(&user)SELECT * FROM users LIMIT 1;// 通過主鍵查詢最后一條記錄 db.Last(&user)SELECT * FROM users ORDER BY id DESC LIMIT 1;// 拿到所有的…

apache 虛擬主機詳細配置:http.conf配置詳解

Apache的配置文件http.conf參數含義詳解 Apache的配置由httpd.conf文件配置&#xff0c;因此下面的配置指令都是在httpd.conf文件中修改。主站點的配置(基本配置) (1) 基本配置:ServerRoot "/mnt/software/apache2" #你的apache軟件安裝的位置。其它指定的目錄如果沒…

深入理解InnoDB(4)—索引使用

1. 索引的代價 在了解索引的代價之前&#xff0c;需要再次回顧一下索引的數據結構B樹 如上圖&#xff0c;是一顆b樹&#xff0c;關于b樹的定義可以參見B樹&#xff0c;這里只說一些重點&#xff0c;淺藍色的塊我們稱之為一個磁盤塊&#xff0c;可以看到每個磁盤塊包含幾個數據…

[BZOJ1626][Usaco2007 Dec]Building Roads 修建道路

1626: [Usaco2007 Dec]Building Roads 修建道路 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 1730 Solved: 727 [Submit][Status][Discuss]Description Farmer John最近得到了一些新的農場&#xff0c;他想新修一些道路使得他的所有農場可以經過原有的或是新修的道路互達…

雙城記s001_雙城記! (使用數據講故事)

雙城記s001Keywords: Data science, Machine learning, Python, Web scraping, Foursquare關鍵字&#xff1a;數據科學&#xff0c;機器學習&#xff0c;Python&#xff0c;Web抓取&#xff0c;Foursquare https://br.pinterest.com/pin/92816442292506979/https://br.pintere…

python:linux中升級python版本

https://www.cnblogs.com/gne-hwz/p/8586430.html 轉載于:https://www.cnblogs.com/gcgc/p/11446403.html