在InnoDB存儲引擎表中,每張表都有個主鍵,若是在建立表時沒有顯示定義主鍵,則InnoDB存儲引擎會按以下方式選擇或建立主鍵:html
l 首先表中是否有非空的惟一索引,如有則該列爲主鍵app
l 不符合上述條件,InnoDB存儲引擎自動建立一個6字節大小的指針指針
InnoDB中全部數據都被邏輯地存放在一個空間中,稱之爲表空間,下圖爲InnoDB邏輯存儲結構:htm
表空間由段、區、頁組成blog
在啓用innodb_file_per_table後,每張表的表空間內存放的只是數據、索引和插入緩衝,其它類的數據,如撤銷信息(Undo),系統事務信息、二次寫緩衝等仍是存放在原來的共享表空間內(ibdata1)。索引
段:事務
由數據段、索引段和回滾段組成,內存
表空間由分散的頁和段組成。get
區:innodb
區由64個連續的頁組成,每一個頁大小16kB,即每一個區大小爲1M。
啓用innodb_file_per_table後,建立默認大小爲96KB的表,
按照區由64頁組成,大小應該是1M?
這是因爲每一個段開始時,先有32頁大小的碎片頁來存放數據,當這些頁使用完後纔是64個連續頁的申請。
實驗:
先建立一個表:
其中col2部分大小爲7000字節,這樣,一頁(16K)中能夠放2個記錄。
初始狀況下有6頁大小(96KB),見下圖:
插入兩條記錄後,
INSERT INTO tt SELECT NULL, REPEAT(‘a’, 7000);
其中page level表明索引層,因此上圖中有一個葉節點(page level爲0)。
繼續插入一條數據後:
先創建一個存儲過程(用於生成60條插入語句,這樣共插入63條,則會佔有32頁):
此時文件大小變成592KB(這裏沒有按照區的大小分配(1M)),共計592/16 = 37頁。即新增31頁。
這時用完了32KB的碎片頁,若是再增長一條記錄,那麼會申請會是以區的方式進行空間申請。
如今變成2M大小
後面都會按照區的大小進行分配:
再增長2條記錄後,發現大小變成9M,同時B-tree Node變成35個
頁:
頁是InnoDB磁盤管理的最小單位。大小爲16KB,不可更改。
行:
每頁最多存放16KB/2到200行記錄
2、InnoDB物理存儲結構
在將innodb_file_per_table設置爲on後,每一個表將獨立地產生一個表空間文件,以ibd結尾,裏面保存數據、索引、表的內部數據字典信息
表結構定義文件以frm結尾,這個文件與存儲引擎無關。
3、InnoDB行記錄格式
InnoDB中支持多種行記錄格式,如Compressed、Dynamic、Compact以及Redybdant等
1)Compact行記錄格式
在該格式中,無論是char仍是varchar類型,NULL值是不佔用存儲空間的。
2)Redundant行記錄格式
在該格式中,char類型的NULL是須要佔用空間的,varchar的NULL不佔用空間。
4、InnoDB數據頁結構