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

MySQL之InnoDB引擎中的Compact行格式用法

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

1、背景

mysql中數(shù)據(jù)存儲是存儲引擎干的事,InnoDB存儲引擎以頁為單位存儲數(shù)據(jù),每個頁的大小為16KB,平時我們操作數(shù)據(jù)庫都是以行為單位進(jìn)行增刪改查,行數(shù)據(jù)是存儲在頁上的,行的格式有4種:Compat、Redundant、Dynamic、Compressed,今天我們來講一下Compat行格式。

2、數(shù)據(jù)示例

我們建表語句中使用的varchar、text、blob等類型不確定長度的就使用了Compact行格式,為了方便理解我們手動創(chuàng)建一個表并且插入兩條記錄,后面都結(jié)合這兩條記錄來進(jìn)行Compat行格式講解,表和記錄如下:

  • 創(chuàng)建表
CREATE TABLE test_compact
(
    id INT AUTO_INCREMENT PRIMARY KEY,
    str1 VARCHAR(255) NOT NULL DEFAULT '',
    str2 VARCHAR(255),
    str3 CHAR(5)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 ROW_FORMAT=COMPACT;
  • 插入數(shù)據(jù)
INSERT INTO test_compact (str1, str2, str3)
VALUES ('AA', 'BB', 'CCC'),
       ('AAA', NULL, NULL);
  • 查看數(shù)據(jù)
mysql [xxx]> select * from test_compact;
+----+------+------+------+
| id | str1 | str2 | str3 |
+----+------+------+------+
|  1 | AA   | BB   | CCC  |
|  2 | AAA  | NULL | NULL |
+----+------+------+------+
2 rows in set (0.001 sec)
  • 查看表的行格式
mysql [xxx]> show table  status like 'test_compact' \G;
*************************** 1. row ***************************
            Name: test_compact
          Engine: InnoDB
         Version: 10
      Row_format: Compact //目前表使用的行格式
            Rows: 2
  Avg_row_length: 8192
     Data_length: 16384
 Max_data_length: 0
    Index_length: 0
       Data_free: 0
  Auto_increment: 3
     Create_time: 2024-12-13 17:20:47
     Update_time: 2024-12-13 17:21:02
      Check_time: NULL
       Collation: utf8mb4_general_ci
        Checksum: NULL
  Create_options: row_format=COMPACT  //創(chuàng)建表時指定的格式
         Comment: 
Max_index_length: 0
       Temporary: N
1 row in set (0.001 sec)

3、Compact解釋

【1】組成

Compact行格式組成圖如下:

在這里插入圖片描述

Compact行由頭部信息+隱藏行+數(shù)據(jù)列三部分組成。

  • 頭部信息:由三部分組成,可變長度列的實際長度信息、列是否為NULL信息、描述記錄信息。
  • 隱藏列:有三列,DB_ROW_ID、DB_TRX_ID、DB_ROLL_PTR,后面詳細(xì)講解。
  • 數(shù)據(jù)列:每一列的值。

【2】頭部信息

頭部信息可以如圖表示:

在這插入圖片描述

接下來就結(jié)合上面創(chuàng)建的test_compact表和插入的記錄進(jìn)行理解。

可變長度列指的就是表中的str1和str2字段,因為str1和str2長度不固定,所以需要額外花費空間來記錄str1和str2的長度,str1和str2的值只有不為NULL的時候才需要記錄長度,并且str1和str2長度的順序是根據(jù)列順序的逆序來存放。

存放str1和str2長度大小為1個或者2個字節(jié),判斷方法是:可變字段存儲的最大字節(jié)>255字節(jié)并且真實存儲的字節(jié)數(shù)>127字節(jié)就使用2個字節(jié)存儲長度,否則使用1個字節(jié)存儲長度。

可變字段存儲的最大字節(jié)=varchar(n)里的n * 字符集的最大字節(jié)數(shù)。n代表的是字符數(shù),而我們用的utf8mb4字符集1個字符用1~4個字節(jié)表示,可以用如下命令看:

mysql [xxx]> show charset like 'utf8mb4';
+---------+---------------+--------------------+--------+
| Charset | Description   | Default collation  | Maxlen |
+---------+---------------+--------------------+--------+
| utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci |      4 |
+---------+---------------+--------------------+--------+
1 row in set (0.001 sec)

可以看到utf8mb4可以表示的一個字符最大字節(jié)為4,所以str1和str2列可以存儲的最大字節(jié)數(shù)為255 * 4 = 4080,ASCII字符只占用1個字節(jié),第一條記錄中的str1和str2實際長度都為2個字節(jié)。

同樣的str3的類型為CHAR(5),根據(jù)字符集決定存它儲字節(jié)的范圍為5~20,所以str3的長度信息也需要進(jìn)行存儲。

第一條記錄str3內(nèi)容’CCC’長度看起來雖然為3,實際上長度為5,這是為了防止更新str3為大于3小于5的數(shù)據(jù)時,以前的空間就成為了空間碎片需要釋放。

可以用下圖表示上面2條記錄長度的存儲信息:

可以為NULL列表指的就是沒有NOT NULL修飾的str2和str3列,用二進(jìn)制的0和1來表示列是否為NULL值,0代表非NULL,1代表NULL,根據(jù)列的順序逆序排列NULL信息,必須用二進(jìn)制的整數(shù)倍來存儲NULL信息,不足1字節(jié)高位補0,上面2條記錄的NULL信息如下:

在這里插入圖片描述

行記錄描述信息是由5個字節(jié)也就是40個二進(jìn)制位組成,不同位代表不同的含義,不做過多解釋。

【3】隱藏列

InnoDB存儲引擎會為每一行數(shù)據(jù)額外分配三個列:DB_ROW_ID、DB_TRX_ID、DB_ROLL_PTR,通過表格來理解一下:

隱藏列描述大小
DB_ROW_ID唯一標(biāo)識6字節(jié)
DB_TRX_ID事務(wù)id6字節(jié)
DB_ROLL_PTR指向要回滾數(shù)據(jù)的地址7字節(jié)

DB_ROW_ID只有主鍵和unique健都不存在時,InnoDB存儲引擎會創(chuàng)建一個大小為6字節(jié)作為隱藏主鍵id使用。

【4】數(shù)據(jù)列

數(shù)據(jù)列只需要注意值為NULL的列不需要再去花空間去存儲,因為頭部信息的NULL列表已經(jīng)存儲了是否為NULL,所以上面2條記錄完整表示如下:

在這里插入圖片描述

4、總結(jié)

本篇文章講了Compact行格式組成,其它幾種格式都差不多,Redundant會記錄所有列的長度信息,通過相鄰列的偏移量來計算列的長度;Dynamic、Compressed格式在行溢出(列數(shù)據(jù)過于大頁面存不下)時列數(shù)據(jù)只存儲其它頁的地址,數(shù)據(jù)全存儲在其它頁通過鏈表連接;Compact和Redundant會在當(dāng)前頁存儲一部分?jǐn)?shù)據(jù)信息和在其它頁的剩余數(shù)據(jù)地址。

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

相關(guān)文章

  • MySQL 自增 ID 超過 int 最大值的問題解決

    MySQL 自增 ID 超過 int 最大值的問題解決

    本文主要介紹了MySQL 自增 ID 超過 int 最大值的問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-06-06
  • Win10下mysql 8.0.15 安裝配置方法圖文教程

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

    這篇文章主要為大家詳細(xì)介紹了Win10下mysql 8.0.15 安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • MySQL出現(xiàn)莫名其妙的斷開連接以及解決方案

    MySQL出現(xiàn)莫名其妙的斷開連接以及解決方案

    這篇文章主要介紹了MySQL出現(xiàn)莫名其妙的斷開連接以及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • MySQL中索引失效的12種場景及對應(yīng)解決方案

    MySQL中索引失效的12種場景及對應(yīng)解決方案

    MySQL索引是提升數(shù)據(jù)庫性能的關(guān)鍵因素,正確使用索引可以將查詢效率提高幾十倍甚至上百倍,本文將分享MySQL索引失效的12種典型場景,需要的可以參考一下
    2025-05-05
  • MySQL?如何將查詢結(jié)果導(dǎo)出到文件(select?…?into?Statement)

    MySQL?如何將查詢結(jié)果導(dǎo)出到文件(select?…?into?Statement)

    我們經(jīng)常會遇到需要將SQL查詢結(jié)果導(dǎo)出到文件,以便后續(xù)的傳輸或數(shù)據(jù)分析的場景,本文就MySQL中select…into的用法進(jìn)行演示,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • apache中訪問不了偽靜態(tài)頁面的解決方法

    apache中訪問不了偽靜態(tài)頁面的解決方法

    apache中訪問不了偽靜態(tài)頁面的解決方法,有需要的朋友可以參考下
    2013-02-02
  • MySQL字段值如何區(qū)分大小寫問題

    MySQL字段值如何區(qū)分大小寫問題

    這篇文章主要介紹了MySQL字段值如何區(qū)分大小寫問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • MySQL存儲過程中變量的定義以及應(yīng)用詳解

    MySQL存儲過程中變量的定義以及應(yīng)用詳解

    MySQL變量定義和應(yīng)用是我們經(jīng)常會遇到的問題,下面這篇文章主要給大家介紹了關(guān)于MySQL存儲過程中變量的定義以及應(yīng)用的相關(guān)資料,文章通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • MySQL?到?ClickHouse?實時數(shù)據(jù)同步實操

    MySQL?到?ClickHouse?實時數(shù)據(jù)同步實操

    這篇文章主要分享的是MySQL?到?ClickHouse?實時數(shù)據(jù)同步實操,小編測試了測了一種方式,可以非常方便地完成?MySQL?數(shù)據(jù)實時同步到ClickHouse,跟大家分享一下,希望對你有幫助
    2022-01-01
  • SQL更新與刪除數(shù)據(jù)操作示例詳解

    SQL更新與刪除數(shù)據(jù)操作示例詳解

    如果要在程序運行過程中操作數(shù)據(jù)庫中的數(shù)據(jù),那得先學(xué)會使用SQL語句,下面這篇文章主要給大家介紹了關(guān)于SQL查詢語句更新和刪除數(shù)據(jù)的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01

最新評論

博湖县| 池州市| 于都县| 天峨县| 津市市| 龙井市| 桓台县| 恩施市| 清镇市| 广宁县| 绩溪县| 财经| 临湘市| 屯留县| 清新县| 冕宁县| 丰台区| 东安县| 共和县| 华容县| 诸城市| 竹北市| 名山县| 乌兰县| 广东省| 贵州省| 葵青区| 左权县| 灯塔市| 定远县| 大港区| 淮滨县| 天长市| 顺义区| 旺苍县| 安乡县| 光山县| 马公市| 宣威市| 武宁县| 高安市|