MySQL InnoDB 邏輯存儲結構html
從InnoDB存儲引擎的邏輯結構看,全部數據都被邏輯地存放在一個空間內,稱爲表空間,而表空間由段(sengment)、區(extent)、頁(page)組成。ps:頁在一些文檔中又稱塊(block)。node
InnoDB存儲引擎的邏輯存儲結構大體以下:mysql
1、表空間(table space)sql
表空間分爲了兩種,這裏簡單的歸納一下:post
1. 獨立表空間:每個表都將會生成以獨立的文件方式來進行存儲,每個表都有一個.frm表描述文件,還有一個.ibd文件。 其中這個文件包括了單獨一個表的數據內容以及索引內容,默認狀況下它的存儲位置也是在表的位置之中。url
2. 共享表空間: Innodb的全部數據保存在一個單獨的表空間裏面,而這個表空間能夠由不少個文件組成,一個表能夠跨多個文件存在,因此其大小限制再也不是文件大小的限制,而是其自身的限制。從Innodb的官方文檔中能夠看到,其表空間的最大限制爲64TB,也就是說,Innodb的單表限制基本上也在64TB左右了,固然這個大小是包括這個表的全部索引等其餘相關數據。spa
InnoDB把數據保存在表空間內,表空間能夠看做是InnoDB存儲引擎邏輯結構的最高層。本質上是一個由一個或多個磁盤文件組成的虛擬文件系統。InnoDB用表空間並不僅是存儲表和索引,還保存了回滾段、雙寫緩衝區等。 htm
2、段(segment)對象
表空間是由各個段組成的,常見的段有數據段、索引段、回滾段等。前一篇文章(MySQL InnoDB 索引組織表 & 主鍵做用)已經介紹了關於InnoDB存儲引擎室索引組織(index organized),所以數據即索引,索引即數據。那麼數據段即爲B+樹段葉子節點(Leaf node segment),索引段即爲B+樹段非索引節點。blog
3、區(extent)
區是由連續的頁(Page)組成的空間,在任何狀況下每一個區大小都爲1MB,爲了保證頁的連續性,InnoDB存儲引擎每次從磁盤一次申請4-5個區。默認狀況下,InnoDB存儲引擎的頁大小爲16KB,即一個區中有64個連續的頁。 (1MB/16KB=64)
InnoDB1.0.x版本開始引入壓縮頁,每一個頁的大小能夠經過參數KEY_BLOCK_SIZE設置爲2K、4K、8K,所以每一個區對應的頁尾5十二、25六、128.
InnpDB1.2.x版本新增了參數innodb_page_size,經過該參數能夠將默認頁的大小設置爲4K、8K,可是頁中的數據不是壓縮的。
可是有時候爲了節約磁盤容量的開銷,建立表默認大小是96KB,區中是64個連續的頁。(對於一些小表)
4、頁(Page)
頁是InnoDB存儲引擎磁盤管理的最小單位,每一個頁默認16KB;InnoDB存儲引擎從1.2.x版本礙事,能夠經過參數innodb_page_size將頁的大小設置爲4K、8K、16K。若設置完成,則全部表中頁的大小都爲innodb_page_size,不能夠再次對其進行修改,除非經過mysqldump導入和導出操做來產生新的庫。
innoDB存儲引擎中,常見的頁類型有:
1. 數據頁(B-tree Node)
2. undo頁(undo Log Page)
3. 系統頁 (System Page)
4. 事物數據頁 (Transaction System Page)
5. 插入緩衝位圖頁(Insert Buffer Bitmap)
6. 插入緩衝空閒列表頁(Insert Buffer Free List)
7. 未壓縮的二進制大對象頁(Uncompressed BLOB Page)
8. 壓縮的二進制大對象頁 (compressed BLOB Page)
5、行(row)
InnoDB存儲引擎是面向列的(row-oriented),也就是說數據是按行進行存放的,每一個頁存放的行記錄也是有硬性定義的,最多容許存放16KB/2-200,即7992行記錄。
如有不恰當之處,還望指教,謝謝!
參考書籍:
[1]. MySQL技術內幕:InnoDB存儲引擎