天天看點

【MySQL從入門到精通】【進階篇】(十二)InnoDB資料存儲結構概述

您好,我是碼農飛哥,感謝您閱讀本文,歡迎一鍵三連哦。

文章目錄

  • ​​1. 簡介​​
  • ​​2. 資料庫的存儲結構:頁​​
  • ​​2.1. 磁盤與記憶體互動基本機關:頁​​
  • ​​2.2. 頁結構概述​​
  • ​​2.3. 頁的大小​​
  • ​​2.4. 頁的上層結構​​

1. 簡介

上一篇文章我們介紹了【MySQL從入門到精通】【進階篇】(十一)Hash索引、AVL樹、B樹與B+樹對比。這篇文章接着來介紹InnoDB資料存儲結構。

2. 資料庫的存儲結構:頁

索引結構給我們提供了高效的索引方式,不過索引資訊以及資料記錄都是儲存在檔案上的,确切說是存儲在頁結構中。另一方面,索引是在存儲引擎中實作的,MySQL伺服器上的存儲引擎負責對表中資料的讀取和寫入工作。不同存儲引擎中存放格式一般不同,甚至有的存儲引擎比如Memory都不用磁盤來存儲資料。在InnoDB中資料是存儲在ibd檔案中。

2.1. 磁盤與記憶體互動基本機關:頁

InnoDB 将資料劃分為若幹個頁,InnoDB中頁的大小預設為16KB。

以頁作為磁盤和記憶體之間互動的基本機關,也就是說一次最少從磁盤中讀取16KB的内容到記憶體中,一次最少把記憶體中16KB内容重新整理到磁盤中。也就是說:在資料庫中,不論讀一行,還是讀多行,都是将這些行所在的頁進行加載。也就是說,資料庫管理存儲空間的基本機關是頁(Page),資料庫I/O操作的最小機關是頁,一個頁中可以存儲多個行記錄。

記錄是按照行來存儲的,但是資料庫的讀取并不以行為機關,否則一次讀取(也就是一次IO操作)隻能處理一行資料,效率會非常低。

2.2. 頁結構概述

頁a、頁b、頁c…頁n這些頁可以不在實體結構上相連,隻要通過雙向連結清單 相關聯即可。每個資料頁中的記錄會按照主鍵值從小到大的順序組成一個單向連結清單,每個資料頁都會為存儲在它裡邊的記錄生成一個頁目錄,在通過主鍵查找某條記錄的時候可以在頁目錄中使用二分法快速定位到對應的槽,然後再周遊該槽對應分組中的記錄即可快速找到指定的記錄。

2.3. 頁的大小

不同的資料庫管理系統(簡稱DBMS)的頁大小不同。比如在MySQL的InnoDB存儲引擎中,預設頁的大小是16KB,我們可以通過下面的指令來檢視:

mysql>show variables like '%innodb_page_size%'      
【MySQL從入門到精通】【進階篇】(十二)InnoDB資料存儲結構概述

2.4. 頁的上層結構

  1. 區(Extent): 是比頁大一級的存儲結構,在InnoDB存儲引擎中,一個區會配置設定64個連續的頁。 因為InnoDB中頁大小預設是16KB,是以一個區的大小是64*16KB=1MB。
  2. 段(Segment): 由一個或多個區組成,區在檔案系統是一個連續配置設定的空間(在InnoDB中是連續的64個頁),不過在段中不要求區與區之間是相鄰的。段是資料庫中的配置設定機關,不同類型的資料庫對象以不同的段形式存在。當我們建立資料表、索引的時候,就會相應建立對應的段,比如建立一張表時會建立一個表段,建立一個索引時會建立一個索引段。
  3. 表空間(Tablespace)是一個邏輯容器,表空間存儲的對象是段,在一個表空間中可以有一個或多個段,但是一個段隻能屬于一個表空間。資料庫由一個或多個表空間組成,表空間從管理上可以劃分為系統表空間,撤銷表空間,臨時表空間等。

    ps:

  4. 如果采用系統表空間模式的,資料資訊和索引資訊都存儲在ibdata1中,
  5. 如果采用獨立表空間存儲模式,data\資料庫名 中還會産生 b.ibd檔案(存儲資料資訊和索引資訊)