MySQL提升筆記(4)InnoDB存儲結構

      網友投稿 1102 2025-03-31

      這一節本來計劃開始索引的學習,但是在InnoDB存儲引擎的索引里,存在一些數據存儲結構的概念,這一節先了解一下InnodDB的邏輯存儲結構,為索引的學習打好基礎。

      從InnoDB存儲引擎的存儲結構看,所有數據都被邏輯地放在一個空間中,稱之為表空間(tablespace)、區(extent)、頁(page)組成,頁在一些文檔中也被稱之為塊(block)。

      1、InnoDB邏輯存儲結構

      InnoDB存儲引擎的邏輯存儲結構大致如圖:

      這張圖更清晰地展示了這些空間的包含關系:

      1.1、表空間(Tablespace)

      表空間可以看做InnoDB邏輯結構的最高層,所有的數據都放在表空間中。

      在默認情況下,InnoDB存儲引擎都有一個共享表空間ibdata1,即所有數據都存放在這個表空間內。如果用戶啟用了參數innodb_file_per_table,則每張表內的數據可以單獨放到一個表空間內。

      如果啟用了innodb_file_per_table參數,也需要注意,每張表的表空間存放的只是數據、索引和插入緩沖Bitmap頁,其它類的數據,如回滾(undo)信息,插入緩沖索引頁、系統事務信息,二次寫緩沖等還是存放在原來的共享表空間內。

      1.2、段(Segment)

      表空間是由各個段組成的,常見的段有數據段、索引段、回滾段等。

      InnoDB存儲引擎表是索引組織(index organized)的,因此數據即索引,索引即數據。那么數據段即為B+樹的葉子節點(Leaf node segment),索引段即為B+樹的非索引節點(Non-leaf node segment),這些內容在后面的索引學習里會詳細介紹。

      1.3、區(extend)

      區是由連續頁組成的空間,在任何情況下每個區的大小都為1MB。為了保證區中頁的連續性,InonoDB存儲引擎一次從磁盤申請4-5個區。在默認情況下,InnoDB存儲引擎的頁的大小為16KB,即一個區中應有64個連續的頁。

      MySQL提升筆記(4)InnoDB存儲結構

      InnoDB1.0.x版本開始引入壓縮頁,每個頁的大小可以通過參數KEY_BLOCK_SIZE設置為2K、4K、8K,因此每個區對應的頁尾512、256、128.

      InnoDB1.2.x版本新增了參數innodb_page_size,通過該參數可以將默認頁的大小設置為4K、8K,但是頁中的數據不是壓縮的。

      但是有時候為了節約磁盤容量的開銷,創建表默認大小是96KB,區中是64個連續的頁。(對于一些小表)

      1.4、頁(page)

      頁是InnoDB存儲引擎磁盤管理的最小單位,每個頁默認16KB;InnoDB存儲引擎從1.2.x版本開始,可以通過參數innodb_page_size將頁的大小設置為4K、8K、16K。

      若設置完成,則所有表中頁的大小都為innodb_page_size,不可以再次對其進行修改,除非通過Mysqldump導入和導出操作來產生新的庫。

      innoDB存儲引擎中,常見的頁類型有:

      ? 數據頁(B-tree Node)

      ? undo頁(undo Log Page)

      ? 系統頁 (System Page)

      ? 事務數據頁 (Transaction System Page)

      ? 插入緩沖位圖頁(Insert Buffer Bitmap)

      ? 插入緩沖空閑列表頁(Insert Buffer Free List)

      ? 未壓縮的二進制大對象頁(Uncompressed BLOB Page)

      ? 壓縮的二進制大對象頁 (compressed BLOB Page)

      1.5、行(row)

      InnoDB存儲引擎是面向行的(row-oriented),也就是說數據是按行進行存放的,每個頁存放的行記錄也是有硬性定義的,最多允許存放16KB/2-200,即7992行記錄。

      2、InnoDB 行記錄格式

      InnoDB 存儲引擎和大多數數據庫一樣(如 Oracle 和 Microsoft SQL Server 數據庫),記錄是以行的形式存儲的。這意味著頁中保存著表中一行行的數據。在 InnoDB 1.0x 版本之前,InnoDB 存儲引擎提供了 Compact 和 Redundant 兩種格式來存放行記錄數據,這也是目前使用最多的一種格式。

      2.1、Compact 行記錄格式

      Compact 行記錄是在 Mysql 5.0 中引人的,其設計目標是髙效地存儲數據。簡單來說,一個頁中存放的行數據越多,其性能就越髙。

      下圖顯示了 Compact 行記錄的存儲方式:

      Compact 行記錄格式的首部是一個非 NULL 變長字段長度列表,并且其是按照列的順序逆序放置的,其長度為:

      若列的長度小于 255 字節,用 1 字節表示;

      若大于 255 個字節,用2 字節表示。

      變長字段的長度最大不可以超過 2 字節,這是因在 MySQL 數據庫中 VARCHAR 類型的最大長度限制為 65535。變長字段之后的第二個部分是 NULL 標志位,該位指示了該行數據中是否有 NULL 值,有則用 1 表示。

      接下來的部分是記錄頭信息(record header),固定占用5 字節(40 位)。每位含義見表:

      最后的部分就是實際存儲每個列的數據。

      需要特別注意的是,NULL 不占該部分任何空間,即 NULL 除了占有 NULL 標志位,實際存儲不占有任何空間。另外有一點需要注意的是,每行數據除了用戶定義的列外,還有兩個隱藏列,事務 1D 列和回滾指針列,分別為 6 字節和 7 字節的大小。若 InnoDB 表沒有定義主鍵,每行還會增加一個 6 字節的 rowid 列。

      Redundant 是 MySQL 5 . 0 版本之前 InnoDB 的 行 記 錄 存 儲 方 式,這里就不展開。

      2.2、行溢出數據

      InnoDB 存儲引擎可以將一條記錄中的某些數據存儲在真正的數據頁之外。因為一般數據頁默認大小為16KB,假如一個數據頁存儲不了插入的數據,這時肯定就會發生行溢出。

      一般認為 BLOB、LOB 這類的大對象列類型的存儲會把數據存放在數據頁之外。但是,BLOB 也可以不將數據放在溢出頁面,而且即便是 VARCHAR 列數據類型,依然有可能被存放為行溢出數據。

      3、InnoDB 數據頁結構

      頁是 InnoDB 存儲引擎管理數據庫最小磁盤單位。頁類型為 B-tree Node 的頁存放的即是表中行的實際數據了。

      InnoDB 數據頁由以下 7 個部分組成:

      File Header (文件頭)

      Page Header (頁頭)

      Infimun 和 Supremum Records

      User Records (用戶記錄,即行記錄)

      Free Space (空閑空間)

      Page Directory (頁目錄)

      File Trailer (文件結尾信息)

      其中 File Header、Page Header、File Trailer的大小是固定的, 分別為 38、56、8 字節,這些空間用來標記該頁的一些信息,如 Checksum, 數據頁所在 B+ 樹索引的層數等。User Records、Free Space、Page Directory 這些部分為實際的行記錄存儲空間,因此大小是動態的。

      參考:

      【1】:《MySQL技術內幕 InnoDB存儲引擎》

      【2】:MySQL Architecture and Components

      【3】:了解 MySQL的數據行、行溢出機制嗎?

      【4】:InnoDB數據頁結構分析

      【5】:InnoDB數據頁結構

      【6】:InnoDB – 行記錄格式

      MySQL

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:mpp甘特圖
      下一篇:注釋怎么弄圈1(注釋怎么標注圈1)
      相關文章
      久久综合日韩亚洲精品色| 亚洲爆乳成av人在线视菜奈实| 亚洲丶国产丶欧美一区二区三区| 亚洲伊人久久大香线蕉啊| 红杏亚洲影院一区二区三区| 处破女第一次亚洲18分钟| 亚洲综合色7777情网站777| 亚洲三级在线视频| 亚洲国产美女在线观看| 久久精品国产亚洲AV嫖农村妇女| 亚洲国产精品婷婷久久| 亚洲AV成人精品网站在线播放| 亚洲AV永久无码区成人网站| 亚洲AV无码一区二区二三区软件| 亚洲成AV人片在线观看| 亚洲av日韩av高潮潮喷无码| 亚洲成人免费在线| 久久夜色精品国产亚洲AV动态图 | 亚洲高清乱码午夜电影网| 亚洲日韩AV一区二区三区中文 | 亚洲综合色丁香婷婷六月图片| 久久亚洲精品成人777大小说| 亚洲视频2020| 亚洲图片校园春色| 久久亚洲精品成人无码网站| 亚洲冬月枫中文字幕在线看| 四虎亚洲精品高清在线观看| 亚洲精品美女久久7777777| 亚洲AV无码乱码在线观看| 亚洲一区日韩高清中文字幕亚洲| 久久久亚洲精品蜜桃臀| 亚洲人成伊人成综合网久久久| 亚洲AV无码精品无码麻豆| 亚洲精品韩国美女在线| 激情内射亚洲一区二区三区爱妻| 日韩亚洲不卡在线视频中文字幕在线观看 | 亚洲精品国产精品乱码不99| 亚洲激情视频在线观看| 亚洲精品国产福利在线观看| 18亚洲男同志videos网站| 亚洲性猛交xx乱|