索引組織表
在InnoDB存儲引擎中,表都是根據主鍵順序組織存放的,這種存儲方式的表稱為索引組織表(index organized table).在InnoDB存儲引擎表中,每張表都有個主鍵(Primary Key),如果在創建表時沒有顯式地定義主鍵,則InnoDB存儲引擎會按如下方式選擇或創建主鍵
1:首先判斷表中是否有非空的唯一索引,如果有,則該列即為主鍵
2:如果不符合上述條件,InnoDB存儲引擎自動創建一個6字節大小的指針
當表中有多個非空唯一索引時,InnoDB存儲引擎將選擇建表時第一個定義的非空唯一索引為主鍵。
InnoDB邏輯存儲結構:
從InnoDB存儲引擎的邏輯存儲結構看,所有數據都被邏輯地存放在一個空間中,稱之為表空間(tablespace).表空間又由段(segment),區(extent)、頁(page)組成。InnoDB存儲引擎的邏輯存儲結構大致如圖所示。
表空間:
表空間可以看做是InnoDB存儲引擎邏輯結構的最高層,所有的數據都存放在表空間中。在默認情況下InnoDB存儲引擎有一個共享表空間ibdata1,即所有數據都存放在這個表空間內,如果用戶啟用了參數innodb_file_per_table,則每張表內的數據可以單獨放到一個表空間內。如果啟用了innodb_file_per_table的參數,需要注意的是每張表的表空間內存放的只是數據、索引和插入緩沖Bitmap頁,其他類的數據如回滾(undo)信息,插入緩沖索引頁、系統事務信息,二次寫緩沖等還是存放在原來的共享表空間內
段:
表空間是由各個段組成的,常見的段有數據段、索引段、回滾段等。因為InnoDB存儲引擎表是索引組織的,因此數據即索引,索引即數據。數據段為B+樹的葉子節點,索引段即為B+樹的非索引節點。在InnoDB存儲引擎中,對段的管理都是由引擎自身所完成。
區:
區是由連續頁組成的空間,在任何情況下每個區的大小都為1MB。為了保證區中頁的連續性,InnoDB存儲引擎一次從磁盤申請4-5個區。在默認情況下,InnoDB存儲引擎頁的大小為16KB,即一個區中一共有64個連續的頁。
在用戶啟用了參數innodb_file_per_table后,創建的表默認大小是96KB。區中是64個連續的頁,創建的表大小至少是1MB才對。其實這是因為在每個段開始時,先用32個頁大小的碎片頁來存放數據,在使用完這些頁之后才是64個連續頁的申請。這樣做的目的是,對於一些小表,或者是undo這類的段,可以在開始時申請較少的空間,節省磁盤容量的開銷。