InnoDB引擎--儲存結構與檔案
資料庫是資料的集合,資料庫管理系統(DBMS)是操作和管理資料庫的應用程式。資料庫應用主要有兩類:OLAP(聯機分析處理)和OLTP(聯機事務處理)。
OLAP的主要特點是:
- 實時性要求不高
- 資料量大
- 併發量小
OLTP的主要特點是:
- 實時性要求高
- 資料量小
- 高併發
- 要求滿足ACID
Mysql體系架構
mysql是一種DBMS,其體系架構如下圖所示:
mysql中整合的是外掛式的儲存引擎,InnoDB引擎是其中之一。儲存引擎基於表而不是資料庫:同一個資料庫中根據不同表的訪問操作需求可以選擇不同的儲存引擎。
InnoDB引擎
InnoDB引擎主要面對OLTP類應用
InnoDB引擎在mysql中處於檔案和檔案系統的上層,管理著對InnoDB引擎表的訪問和更新。
InnoDB引擎邏輯儲存結構
資料需要在一定的資料結構和組織結構下才能進行有效的管理。InnoDB表中的每行資料是基於B+樹儲存的,其中B+樹中的順序依據是主鍵的順序,稱為索引組織表。B+樹儲存在資料檔案中,在B+樹之外,InnoDB對資料檔案中資料的管理和組織定義一個新的邏輯結構如下圖所示:
所有的資料都被邏輯地存放在表空間中,對於整個資料庫中的InnoDB表,可以共用一個表空間,也可以將表空間拆分為共享表空間和各個表私有的表空間。拆分後,私有表空間僅儲存該表的資料、索引、和插入緩衝BitMap頁,其他類的資料如回滾(undo)資訊、系統事務資訊等還是儲存在共享表空間裡。
共享表空間檔案格式:
私有表空間檔案格式:
表空間中的資料分類為各個段:資料段、索引段、回滾段等。為了 便於管理,在各個段中繼續拆分為區,區再細化拆分為連續的頁,頁是InnoDB磁碟管理的最小單位(即InnoDB從磁碟讀取和寫入都是以頁為單位進行的)。頁中按關係表中的行來儲存實際的關係資料。
在InnoDB中,表的資料均儲存在B+樹的葉子節點上,資料也是索引的一部分,即聚集索引。
InnoDB索引頁的檔案格式:
先看FIL Header:
FIL Header中包含了索引頁作為檔案的資訊。儲存了指向上個頁和下個頁的指標,即索引頁之間是通過連結串列連線起來的;同時還儲存了該頁的LSN(Log Squence Number),用於支援CheckPoint。
再看INDEX Header:
INDEX Header中包含了對於索引頁作為索引的資訊。儲存了索引頁中記錄的數量,索引節點的型別(根節點、非葉結點、葉結點),頁目錄槽數(Page Directory)等資訊。
然後就是User Records行記錄了,儲存了B+樹索引非葉節點資料和葉結點資料,從圖中可以看出User Records在物理上並不有序,但是邏輯上是以單鏈表有序的,順序為主鍵順序。
最後來看頁目錄(Page Directory)。User Records是以單鏈表組織的,一個頁的大小是16K,最多可以儲存近8000行資料,查詢某一個行時需要順序遍歷所有行,引入Page Directory對User Records進行二分查詢,提高頁內資料查詢效率,如下圖所示:
最終,以表、段、區、頁的邏輯結構為載體,構建出InnoDB表B+樹的邏輯結構如下圖:
Mysql相關檔案
引數檔案
mysql資料庫的配置檔案,包含了各類系統引數。
日誌檔案
mysql中常見的日誌檔案:
- error log:記錄了mysql啟動、執行、關閉過程。
- binary log:記錄了對mysql資料庫執行更改(不包含查詢)的所有操作。
- slow query log:記錄執行超過指定時間值的SQL語句。
- query log:記錄所有對mysql資料庫請求的資訊。
表結構檔案
無論選用什麼儲存引擎,mysql會對定義的表和檢視生成(表名.frm)檔案用以儲存表和檢視的結構定義。
以下為InnoDB引擎的檔案:
表空間檔案
- 共享表空間檔案:ibdata1
- 私有表空間檔案:表名.ibd
redo log檔案
ib_logfile0 與 ib_logfile1,用於支援事務的永續性。