InnoDB存儲結構圖以下所示, 咱們這裏只作簡要的介紹, 更多細節咱們將在後續的文章中再進行詳細闡述,php
經過innodb_file_per_table參數, 咱們能夠爲每一個表都建立一個表空間, 這個就是這個表的獨立表空間, 這個表的索引段, 數據段都會存儲在這個獨立表空間中, 可是Redo log, Undo log仍然在各自的表空間中, 表空間存儲以下圖, mysql
InnoDB的頁存儲結構以下, 每頁都是由3部分組成, File Header(38字節)、File Body、File Trailer(8字節), 不一樣頁的File Body存儲的內容不一樣,算法
名稱 | 大小 | 說明 |
---|---|---|
FIL_PAGE_SPACE_OR_CHKSUM | 4字節 | 頁的校驗碼 |
FIL_PAGE_OFFSET | 4字節 | 表空間中頁的便宜量 |
FIL_PAGE_PREV | 4字節 | 上一頁 |
FIL_PAGE_NEXT | 4字節 | 下一頁 |
FIL_PAGE_LSN | 8字節 | 頁面被最後修改時對應的日誌序列位置 |
FIL_PAGE_TYPE | 2字節 | 頁面類型 |
FIL_PAGE_FILE_FLUSH_LSN | 8字節 | 系統表空間中有定義, 表明文件更新到的LSN |
FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID | 4字節 | 頁面所屬表空間id |
名稱 | 值 | 說明 |
---|---|---|
FIL_PAGE_TYPE_ALLOCATED | 0x0000 | 未使用 |
FIL_PAGE_UNDO_LOG | 0x0002 | undo log |
FIL_PAGE_INODE | 0x0003 | 存儲了段信息 |
FIL_PAGE_IBUF_FREE_LIST | 0x0004 | Insert Buffer空閒列表 |
FIL_PAGE_IBUF_BITMAP | 0x0005 | Insert Buffer位圖 |
FIL_PAGE_TYPE_SYS | 0x0006 | 系統頁 |
FIL_PAGE_TYPE_TRX_SYS | 0x0007 | 事務系統數據 |
FIL_PAGE_TYPE_FSP_HDR | 0x0008 | 表空間頭部信息 |
FIL_PAGE_TYPE_XDES | 0x0009 | 擴展描述頁 |
FIL_PAGE_TYPE_BLOB | 0x000A | BLOB頁 |
FIL_PAGE_SDI | 0x45bd | SDI索引頁 |
FIL_PAGE_RTREE | 0x45be | R-tree |
FIL_PAGE_INDEX | 0x45bf | B-tree |
看完InnoDB頁結構後, 咱們看下數據頁的存儲,sql
名稱 | 大小 | 說明 |
---|---|---|
PAGE_N_DIR_SLOTS | 2字節 | page directory中slot的個數 |
PAGE_HEAP_TOP | 2字節 | 堆中第一個記錄指針 |
PAGE_N_HEAP | 2字節 | 堆中記錄數 |
PAGE_FREE | 2字節 | 指向空閒空間首地址 |
PAGE_GARBAGE | 2字節 | 已經刪除的記錄數 |
PAGE_LAST_INSERT | 2字節 | 最後插入位置 |
PAGE_DIRECTION | 2字節 | 最後插入方向 |
PAGE_N_DIRECTION | 2字節 | 一個插入方向連續插入記錄數 |
PAGE_N_RECS | 2字節 | 這個頁的記錄總數 |
PAGE_MAX_TRX_ID | 8字節 | 修改當前頁的最大事務ID |
PAGE_LEVEL | 2字節 | 當前頁在索引中的層, 葉子節點爲0x00 |
PAGE_INDEX_ID | 8字節 | 索引ID |
PAGE_BTR_SEG_LEAF | 10字節 | 非葉子節點所在段, 僅在B+樹的root頁中有定義 |
PAGE_BTR_SEG_TOP | 10字節 | 數據頁所在段, 僅在B+樹的root頁中有定義 |
虛擬記錄, Infimum爲13字節, Supermum也是13字節。具體存儲內容, 咱們會在下面進行介紹。數據庫
限於篇幅, 咱們這裏主要介紹compact格式的行記錄存儲, 存儲格式以下圖,數據結構
爲了便於你們理解, 這部分咱們給出一些實例,學習
create table `t` (`id` int not null, primary key(`id`)) engine=InnoDB ROW_FORMAT=Compact;
InnoDB數據存儲是經過B+樹組織的, 一個很簡單的B+樹以下所示,spa
咱們首先看下當表中數據不多的時候, 數據是如何組織的, 具體操做步驟以下,debug
insert into t values (2); insert into t values (1);
0010000: a76e 6043 0000 0004 ffff ffff ffff ffff .n`C............ 0010010: 0000 0000 012e 6d9d 45bf 0000 0000 0000 ......m.E....... 0010020: 0000 0000 0005 0002 00a4 8004 0000 0000 ................ 0010030: 0093 0001 0001 0002 0000 0000 0000 0000 ................ 0010040: 0000 0000 0000 0000 0091 0000 0005 0000 ................ 0010050: 0002 0272 0000 0005 0000 0002 01b2 0100 ...r............ 0010060: 0200 3069 6e66 696d 756d 0003 000b 0000 ..0infimum...... 0010070: 7375 7072 656d 756d 0000 10ff f380 0000 supremum........ 0010080: 0200 0000 001c 0481 0000 00fa 0110 0000 ................ 0010090: 18ff ea80 0000 0100 0000 001c 0582 0000 ................ 00100a0: 012c 0110 0000 0000 0000 0000 0000 0000 .,.............. 00100b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ ...... ...... 0013fe0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0013ff0: 0000 0000 0070 0063 a76e 6043 012e 6d9d .....p.c.n`C..m.
0010070: .... .... .... .... 0000 10ff f380 0000 0010080: 0200 0000 001c 0481 0000 00fa 0110 ....
0013ff0: 0000 0000 0070 0063 .... .... .... ....
在4.1的基礎上, 咱們繼續插入數據, 操做步驟以下,設計
<?php $servername = "localhost:8083"; $username = "root"; $password = "password"; $dbname = "test"; try { $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); for($i = 3; $i < 1000; $i++){ $sql = "INSERT INTO t VALUES (" . strval($i) . ")"; $conn->exec($sql); } } catch(PDOException $e){ echo $sql . "<br>" . $e->getMessage(); } $conn = null; ?>
0010000: df67 193d 0000 0004 ffff ffff ffff ffff .g.=............ 0010010: 0000 0000 0132 5500 45bf 0000 0000 0000 .....2U.E....... 0010020: 0000 0000 0005 0002 0092 8004 0000 0000 ................ 0010030: 008a 0002 0001 0002 0000 0000 0000 0000 ................ 0010040: 0001 0000 0000 0000 0091 0000 0005 0000 ................ 0010050: 0002 0272 0000 0005 0000 0002 01b2 0100 ...r............ 0010060: 0200 1a69 6e66 696d 756d 0003 000b 0000 ...infimum...... 0010070: 7375 7072 656d 756d 1000 1100 0d80 0000 supremum........ 0010080: 0100 0000 0500 0019 ffe6 8000 0153 0000 .............S.. 0010090: 0006 0000 0000 0000 0000 0000 0000 0000 ................ ....... ....... 0013fe0: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0013ff0: 0000 0000 0070 0063 df67 193d 0132 5500 .....p.c.g.=.2U.
0010070: .... .... .... .... 1000 1100 0d80 0000 0010080: 0100 0000 05.. .... .... .... .... ....
主鍵id爲0x80000001, 也就是1, page no爲0x00000005, 也就是page 5
0010080: .... .... ..00 0019 ffe6 8000 0153 0000 0010090: 0006 .... .... .... .... .... .... ....
主鍵id爲0x80000153, 也就是339, page no爲0x00000006, 也就是page 6
0014000: e1c0 bb7a 0000 0005 ffff ffff 0000 0006 ...z............ 0014010: 0000 0000 0132 5500 45bf 0000 0000 0000 .....2U.E....... 0014020: 0000 0000 0005 0056 3a90 82a6 1d89 1d0c .......V:....... 0014030: 0000 0005 0000 0152 0000 0000 0000 0000 .......R........ 0014040: 0000 0000 0000 0000 0091 0000 0000 0000 ................ 0014050: 0000 0000 0000 0000 0000 0000 0000 0100 ................ 0014060: 0200 1a69 6e66 696d 756d 0003 000b 0000 ...infimum...... 0014070: 7375 7072 656d 756d 0000 1000 1680 0000 supremum........ 0014080: 0100 0000 001c 0582 0000 012c 0110 0000 ...........,.... 0014090: 1800 1680 0000 0200 0000 001c 0481 0000 ................ 00140a0: 00fa 0110 0000 2000 1680 0000 0300 0000 ...... ......... ....... ....... 0017e90: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0017ea0: 0000 0000 0070 3a27 39cf 3977 391f 38c7 .....p:'9.9w9.8. 0017eb0: 386f 3817 37bf 3767 370f 36b7 365f 3607 8o8.7.7g7.6.6_6. 0017ec0: 35af 3557 34ff 34a7 344f 33f7 339f 3347 5.5W4.4.4O3.3.3G 0017ed0: 32ef 3297 323f 31e7 318f 3137 30df 3087 2.2.2?1.1.170.0. 0017ee0: 302f 2fd7 2f7f 2f27 2ecf 2e77 2e1f 2dc7 0//././'...w..-. 0017ef0: 2d6f 2d17 2cbf 2c67 2c0f 2bb7 2b5f 2b07 -o-.,.,g,.+.+_+. 0017f00: 2aaf 2a57 29ff 29a7 294f 28f7 289f 2847 *.*W).).)O(.(.(G 0017f10: 27ef 2797 273f 26e7 268f 2637 25df 2587 '.'.'?&.&.&7%.%. 0017f20: 252f 24d7 247f 2427 23cf 2377 231f 22c7 %/$.$.$'#.#w#.". 0017f30: 226f 2217 21bf 2167 210f 20b7 205f 2007 "o".!.!g!. . _ . 0017f40: 1faf 1f57 1eff 1ea7 1e4f 1df7 0070 1d47 ...W.....O...p.G 0017f50: 1cef 1c97 1c3f 1be7 1b8f 1b37 1adf 1a87 .....?.....7.... 0017f60: 1a2f 19d7 197f 1927 18cf 1877 181f 17c7 ./.....'...w.... 0017f70: 176f 1717 16bf 1667 160f 15b7 155f 1507 .o.....g....._.. 0017f80: 14af 1457 13ff 13a7 134f 12f7 129f 1247 ...W.....O.....G 0017f90: 11ef 1197 113f 10e7 108f 1037 0fdf 0f87 .....?.....7.... 0017fa0: 0f2f 0ed7 0e7f 0e27 0dcf 0d77 0d1f 0cc7 ./.....'...w.... 0017fb0: 0c6f 0c17 0bbf 0b67 0b0f 0ab7 0a5f 0a07 .o.....g....._.. 0017fc0: 09af 0957 08ff 08a7 084f 07f7 079f 0747 ...W.....O.....G 0017fd0: 06ef 0697 063f 05e7 058f 0537 04df 0487 .....?.....7.... 0017fe0: 042f 03d7 037f 0327 02cf 0277 021f 01c7 ./.....'...w.... 0017ff0: 016f 0117 00bf 0063 e1c0 bb7a 0132 5500 .o.....c...z.2U.
0018000: 2ddb 788c 0000 0006 0000 0005 ffff ffff -.x............. 0018010: 0000 0000 0133 f431 45bf 0000 0000 0000 .....3.1E....... 0018020: 0000 0000 0005 00a6 3946 8297 0000 0000 ........9F...... 0018030: 3935 0002 0142 0295 0000 0000 0000 0000 95...B.......... 0018040: 0000 0000 0000 0000 0091 0000 0000 0000 ................ 0018050: 0000 0000 0000 0000 0000 0000 0000 0100 ................ 0018060: 0200 1a69 6e66 696d 756d 0006 000b 0000 ...infimum...... 0018070: 7375 7072 656d 756d 0000 1000 1680 0001 supremum........ 0018080: 5300 0000 001d 6d81 0000 00a3 0110 0000 S.....m......... ....... ....... 001bea0: 0000 0000 0000 0000 0000 0000 0070 38c7 .............p8. 001beb0: 386f 3817 37bf 3767 370f 36b7 365f 3607 8o8.7.7g7.6.6_6. 001bec0: 35af 3557 34ff 34a7 344f 33f7 339f 3347 5.5W4.4.4O3.3.3G 001bed0: 32ef 3297 323f 31e7 318f 3137 30df 3087 2.2.2?1.1.170.0. 001bee0: 302f 2fd7 2f7f 2f27 2ecf 2e77 2e1f 2dc7 0//././'...w..-. 001bef0: 2d6f 2d17 2cbf 2c67 2c0f 2bb7 2b5f 2b07 -o-.,.,g,.+.+_+. 001bf00: 2aaf 2a57 29ff 29a7 294f 28f7 289f 2847 *.*W).).)O(.(.(G 001bf10: 27ef 2797 273f 26e7 268f 2637 25df 2587 '.'.'?&.&.&7%.%. 001bf20: 252f 24d7 247f 2427 23cf 2377 231f 22c7 %/$.$.$'#.#w#.". 001bf30: 226f 2217 21bf 2167 210f 20b7 205f 2007 "o".!.!g!. . _ . 001bf40: 1faf 1f57 1eff 1ea7 1e4f 1df7 1d9f 1d47 ...W.....O.....G 001bf50: 1cef 1c97 1c3f 1be7 1b8f 1b37 1adf 1a87 .....?.....7.... 001bf60: 1a2f 19d7 197f 1927 18cf 1877 181f 17c7 ./.....'...w.... 001bf70: 176f 1717 16bf 1667 160f 15b7 155f 1507 .o.....g....._.. 001bf80: 14af 1457 13ff 13a7 134f 12f7 129f 1247 ...W.....O.....G 001bf90: 11ef 1197 113f 10e7 108f 1037 0fdf 0f87 .....?.....7.... 001bfa0: 0f2f 0ed7 0e7f 0e27 0dcf 0d77 0d1f 0cc7 ./.....'...w.... 001bfb0: 0c6f 0c17 0bbf 0b67 0b0f 0ab7 0a5f 0a07 .o.....g....._.. 001bfc0: 09af 0957 08ff 08a7 084f 07f7 079f 0747 ...W.....O.....G 001bfd0: 06ef 0697 063f 05e7 058f 0537 04df 0487 .....?.....7.... 001bfe0: 042f 03d7 037f 0327 02cf 0277 021f 01c7 ./.....'...w.... 001bff0: 016f 0117 00bf 0063 2ddb 788c 0133 f431 .o.....c-.x..3.1
本文介紹了innodb的數據頁存儲, 以實例的方式講解了innodb存儲引擎如何存儲一個表中數據的。可是咱們仍然有不少問題沒有給出答案,
InnoDB存儲引擎較爲複雜, 不可能一次性將所有內容學會, 咱們不妨每次帶入一個問題, 深刻尋找這個問題的答案, 關於這些問題, 我會在後續文章中再逐步介紹。