共計 1939 個字符,預計需要花費 5 分鐘才能閱讀完成。
本篇內容介紹了“怎么理解 InnoDB 數據字典”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓丸趣 TV 小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
在 InnoDB 中,系統表實際上是看不到的,不像 Oracle 那樣可以方便地通過一個查詢語句就能得到其中的內容。因為 MySQL 是一個插件式的數據庫管理系統。它的結構分為兩層,分別是 Server 層和存儲引擎層。最早的存儲引擎是 MyISAM,它是沒有數據字典的,關于表結構,它擁有的只有.frm 文件,所以這導致了 InnoDB 也必須要有這個文件才使得 Server 層識別并管理它。對于 Server 層,一個表是什么存儲引擎,這是表的屬性。具體深入到每一個存儲引擎內部,數據字典就不被 Server 層來管理了,這就導致數據字典不能被用戶感知了。
系統表結構
InnoDB 有四個最基本的系統表,用來存儲用戶定義的表,列,索引及索引列等信息,這些表分別為 SYS_TABLES,SYS_COLUMNS,SYS_INDEXES,SYS_FIELDS。
SYS_TABLES
用來存儲所有 InnoDB 為存儲引擎的表
NAME:表示一個表的表名
ID:表示這個表的 ID 號
N_COLS:表示這個表的列的個數,建表指定的列數。
TYPE:表示這個表的存儲類型,包括記錄的格式,壓縮等信息。
SPACE:表示這個表所在表空間 ID 號。這個表對應的主鍵列為 NAME,同時還有一個在 ID 號上的唯一索引。
SYS_COLUMNS
用來存儲 InnoDB 中定義的所有表中所有列的信息,每一列對應這個表的一條記錄。
TABLE_ID:表示這個列所屬的表的 ID 號
POS:表示這個列在表中是第幾列。
NAME:表示這個列名。
MTYPE:表示這個列的主數據類型。
PRTYPE:表示這個列的一些精確數據類型,它是一個組合值,包括 NULL 標志,是否有符號數的標志,是否是二進制字符串的標志及表示這個列是真的 varchar
LEN:表示這個列數據的精度,目前沒有用到。
SYS_INDEXES
用來存儲 InnoDB 中所有表的索引信息,每一條記錄對應一個索引
TABLE_ID:表示這個索引所屬的表的 ID 號。
ID:表示這個索引的索引 ID 號
NAME:表示這個索引的索引名
N_FIELDS:表示這個索引包括的列個數。
TYPE:表示這個索引的類型,包括聚簇索引,唯一索引,等
SPACE:表示這個索引數據所在的表空間 ID 號
PAGE_NO:表示這個索引對應的 B + 樹根頁面。
SYS_FIEDS
用來存儲所有索引中定義的索引列,每一條記錄對應一個索引列。
INDEX_ID:這個列所在的索引
POS:這個列在某個索引中是第幾個索引列
COL_NAME:這個索引列的列名。
字典表的加載
InnoDB 啟動的時候,如果是新建數據庫,則需要初始化庫,索引需要創建字典管理的 B + 樹信息。因為 InnoDB 中的系統表的結構,個數等都是固定的,所以在初始化庫的時候只需要創建這幾個表的存儲 B + 樹即可。同時把將這幾個 B + 樹的根頁號存儲在一個固定位置,就不需要將這幾個表自身的信息存儲在系統表中了。對于一個 B 樹,只要找到其根頁面,就可以找檢索其數據了。
對于數據字典表根頁面位置的存儲方式,InnoDB 用了一個專門的頁面(0 號表空間 0 號文件的 7 號頁面)來管理數據字典信息。這個頁面用來存儲 4 個系統表的五個根頁面號(有 5 個索引)。
普通用戶表的加載過程,當用戶訪問一個表時,系統首先會從表對象緩沖池中查找這個表 SHARE 對象,如果找到,則直接從其實例化表對象空間鏈表中拿一個空閑的實例化的表對象使用,如果沒有一個可用的實例化對象,則需要重新打開(實例化這個表),在實例化這個表的時候,需要找到這個表的字典信息,包括這個表本身,列信息及索引信息等,這些信息很多都是從 SHARE 對象處獲得。如果沒有 SHARE 對象,則需要從系統表中構造 SHARE 對象。
Rowid 管理
在 InnoDB 中,用戶表中的記錄不一定都會有一個 Rowid 列,Rowid 只有在一個表沒有定義主鍵時,才會分配。而 Rowid 的管理分配,并不是一個表獨享一個 ID 空間,而是全局的,使用表都共享這個 ID 號。
Rowid 的分配并不會直接修改頁面,只要這個值為 256 的倍數的時候才會寫入一次。那么如果插入 200 次,這些值還沒有被寫入,這是系統重新啟動,ID 號豈不是重復使用,因為數據庫啟動的時候會調用函數做一個工作,就是將上次寫入的 Rowid 值向上對齊 256 后在加上 256,這樣就不會有問題了。
“怎么理解 InnoDB 數據字典”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注丸趣 TV 網站,丸趣 TV 小編將為大家輸出更多高質量的實用文章!