innodb的存儲結構

以下所示,innodb的存儲結構包含:表空間,段,區,頁(塊)mysql

image

innodb存儲結構優化的標準是:一個頁裏面存放的行數越多,其性能越高
表空間:零散頁+段
  獨立表空間存放的是:數據、索引、插入緩衝位圖頁。
  共享表空間存放的是:undo信息、系統事務信息、二次寫緩衝、插入緩衝等。共享表空間擴展後就不會回縮了。
段:存儲引擎自動管理
區:由64個連續的頁組成,每一個頁大小爲16K(每一個區大小爲1M),對於大的數據段,innodb存儲引擎每次最多能夠申請4個區,以此來保證數據的順序性能。在每一個段開始都有32個頁大小的碎片頁用來存放數據,當這些頁使用完以後才64個連續頁申請
頁:innodb磁盤管理的最小單位sql

imageimage

 

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文件格式優化

  •   compact行記錄格式:變長字段長度列表(1-2字節)+NULL標誌位(1字節)+記錄頭信息(5字節)+各列數據(除了實際列還有兩個隱藏列)

image

  變長字段長度列表: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

imageimage

  列數據:(額外包含,事務id列,回滾指針列,若是沒有主鍵的話還會有個6字節的rowid),若是某列數據爲NUll則除了NULL標誌位外不佔用任何額外的空間。指針

  •   Rebundant行記錄格式:字段長度偏移列表(1-2字節)+記錄頭信息(6字節)+各列數據

image

  字段長度偏移列表: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

  image

  •   行溢出

  一個頁中至少應該有兩行記錄,若是當前頁中只能存放一條記錄,那麼innodb會自動將行數據存放在真實的數據頁以外
  Antelope文件格式的行溢出:索引

    image

  Barracuda文件格式的行溢出:事務

      imageimage

小實驗:

作了個關於innodb表最大支持多少列的實驗,發現不管用什麼文件格式(DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT)文件的列數都不能超過1017列

相關文章
相關標籤/搜索