以下所示,innodb的存儲結構包含:表空間,段,區,頁(塊)mysql
innodb存儲結構優化的標準是:一個頁裏面存放的行數越多,其性能越高
表空間:零散頁+段
獨立表空間存放的是:數據、索引、插入緩衝位圖頁。
共享表空間存放的是:undo信息、系統事務信息、二次寫緩衝、插入緩衝等。共享表空間擴展後就不會回縮了。
段:存儲引擎自動管理
區:由64個連續的頁組成,每一個頁大小爲16K(每一個區大小爲1M),對於大的數據段,innodb存儲引擎每次最多能夠申請4個區,以此來保證數據的順序性能。在每一個段開始都有32個頁大小的碎片頁用來存放數據,當這些頁使用完以後才64個連續頁申請
頁:innodb磁盤管理的最小單位sql
page 結構:File Header(38字節),Page Header(56字節),Infimun和Supremum Records,User Records,Free Space,Page Directory,File Trailer(8字節)
File header:文件頭裏麪包含了該頁所在表空間信息,該頁在表空間內的偏移量,該頁的checksum值,該頁的LSN值,該頁的類型,該頁的上一頁指針,該頁的下一頁指針,頁號
page header(位置信息、統計信息,狀態信息):在頁目錄中的槽數、第一個記錄的指針、指向可重用空間的首指針、當前頁在索引樹中的位置、索引ID、記錄數、已刪除記錄的字節數、該頁中記錄的數量(包括最大最小記錄)、最後插入記錄的位置、最後插入記錄的方向、一個方向連續插入記錄的數量、修改當前頁的最大事務、PAGE_BTR_SEG_LEAF、PAGE_BTR_SEG_TOP
infimum和supremum record:每一個數據頁中都有兩個虛擬的行,用來限定記錄的邊界
user record:實際存儲行記錄內容
free space:空閒空間,一樣是個鏈表結構。在一條記錄被刪除後,該空間會被加入到空閒鏈表中
page directory:存放了記錄的相對位置,這些記錄的指針稱爲槽
File Trailer:前面四個字節表明該頁的checksum值,最後四個字節與FIle header中的FIL_PAGE_LSN相同,經過比較這兩個值來保證頁的完整性性能
記錄行:innodb存儲引擎是面向行的。每一個頁存放的行也有硬性限制:最少2行,最多容許存放16K/2-200行(7992行)的記錄
Antelope文件格式優化
變長字段長度列表:1-2字節,若是變長字段總和小於256個字符佔用一個字節,大於255個字節小於65535個字節用2個字節存儲,由於2的16次方=65536,因此一個表的變長字段列總和不能超過65535。
NULL標誌位:標誌該行中哪些列爲空,用1表示。spa
記錄頭信息:用5個字節表示,記錄頭中的內容以下:
delete_flag(1 bit):該行是否被刪除
min_rec_flag(1 bit):若是該記錄是預先被定義爲最小的記錄
n_owned(4 bit):當前槽位所管理的記錄數,對於最小記錄所在的分組只能有 1 條記錄,最大記錄所在的分組擁有的記錄條數只能在 1~8 條之間,剩下的分組中記錄的條數範圍只能在是 4~8 條之間
heap_no(13 bit):當前記錄在本頁中的位置
record_type(3 bit):記錄類型,000普通,001表示B+樹節點指針,010表示Infimum,011表示Supremum,1xx表示保留
next_record(16 bit):頁中下一條記錄的相對位置3d
列數據:(額外包含,事務id列,回滾指針列,若是沒有主鍵的話還會有個6字節的rowid),若是某列數據爲NUll則除了NULL標誌位外不佔用任何額外的空間。指針
字段長度偏移列表:1-2字節
記錄頭信息:6字節,記錄頭中的內容以下:
delete_flag(1 bit):該行是否被刪除
min_rec_flag(1 bit):若是該記錄是預先被定義爲最小的記錄,
n_owned(4 bit):當前槽位所管理的記錄數
heap_no(13 bit):當前記錄在本頁中的位置
n_fields(10 bit):記錄中列的數量,因此mysql中單表列的數目最多爲210-1=1024-1=1023列
1byte_offs_flag(1 bit):偏移列表爲1字節仍是2字節
next_record(16 bit):頁中下一條記錄的相對位置blog
一個頁中至少應該有兩行記錄,若是當前頁中只能存放一條記錄,那麼innodb會自動將行數據存放在真實的數據頁以外
Antelope文件格式的行溢出:索引
Barracuda文件格式的行溢出:事務
小實驗:
作了個關於innodb表最大支持多少列的實驗,發現不管用什麼文件格式(DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT)文件的列數都不能超過1017列