溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么理解InnoDB數(shù)據(jù)字典

發(fā)布時間:2021-11-11 16:38:10 來源:億速云 閱讀:172 作者:iii 欄目:MySQL數(shù)據(jù)庫

本篇內(nèi)容介紹了“怎么理解InnoDB數(shù)據(jù)字典”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

   在InnoDB中,系統(tǒng)表實際上是看不到的,不像Oracle那樣可以方便地通過一個查詢語句就能得到其中的內(nèi)容。因為MySQL是一個插件式的數(shù)據(jù)庫管理系統(tǒng)。它的結(jié)構(gòu)分為兩層,分別是Server層和存儲引擎層。最早的存儲引擎是MyISAM,它是沒有數(shù)據(jù)字典的,關(guān)于表結(jié)構(gòu),它擁有的只有.frm文件,所以這導(dǎo)致了InnoDB也必須要有這個文件才使得Server層識別并管理它。對于Server層,一個表是什么存儲引擎,這是表的屬性。具體深入到每一個存儲引擎內(nèi)部,數(shù)據(jù)字典就不被Server層來管理了,這就導(dǎo)致數(shù)據(jù)字典不能被用戶感知了。
系統(tǒng)表結(jié)構(gòu)
    InnoDB有四個最基本的系統(tǒng)表,用來存儲用戶定義的表,列,索引及索引列等信息,這些表分別為SYS_TABLES,SYS_COLUMNS,SYS_INDEXES,SYS_FIELDS。
SYS_TABLES
用來存儲所有InnoDB為存儲引擎的表
NAME:表示一個表的表名
ID:表示這個表的ID號
N_COLS:表示這個表的列的個數(shù),建表指定的列數(shù)。
TYPE:表示這個表的存儲類型,包括記錄的格式,壓縮等信息。
SPACE:表示這個表所在表空間ID號。這個表對應(yīng)的主鍵列為NAME,同時還有一個在ID號上的唯一索引。
SYS_COLUMNS
用來存儲InnoDB中定義的所有表中所有列的信息,每一列對應(yīng)這個表的一條記錄。
TABLE_ID:表示這個列所屬的表的ID號
POS:表示這個列在表中是第幾列。
NAME:表示這個列名。
MTYPE:表示這個列的主數(shù)據(jù)類型。
PRTYPE:表示這個列的一些精確數(shù)據(jù)類型,它是一個組合值,包括NULL標(biāo)志,是否有符號數(shù)的標(biāo)志,是否是二進(jìn)制字符串的標(biāo)志及表示這個列是真的varchar
LEN:表示這個列數(shù)據(jù)的精度,目前沒有用到。
SYS_INDEXES
用來存儲InnoDB中所有表的索引信息,每一條記錄對應(yīng)一個索引
TABLE_ID:表示這個索引所屬的表的ID號。
ID:表示這個索引的索引ID號
NAME:表示這個索引的索引名
N_FIELDS:表示這個索引包括的列個數(shù)。
TYPE:表示這個索引的類型,包括聚簇索引,唯一索引,等
SPACE:表示這個索引數(shù)據(jù)所在的表空間ID號
PAGE_NO:表示這個索引對應(yīng)的B+樹根頁面。
SYS_FIEDS
用來存儲所有索引中定義的索引列,每一條記錄對應(yīng)一個索引列。
INDEX_ID:這個列所在的索引
POS:這個列在某個索引中是第幾個索引列
COL_NAME:這個索引列的列名。
字典表的加載
  InnoDB啟動的時候,如果是新建數(shù)據(jù)庫,則需要初始化庫,索引需要創(chuàng)建字典管理的B+樹信息。因為InnoDB中的系統(tǒng)表的結(jié)構(gòu),個數(shù)等都是固定的,所以在初始化庫的時候只需要創(chuàng)建這幾個表的存儲B+樹即可。同時把將這幾個B+樹的根頁號存儲在一個固定位置,就不需要將這幾個表自身的信息存儲在系統(tǒng)表中了。對于一個B樹,只要找到其根頁面,就可以找檢索其數(shù)據(jù)了。
  對于數(shù)據(jù)字典表根頁面位置的存儲方式,InnoDB用了一個專門的頁面(0號表空間0號文件的7號頁面)來管理數(shù)據(jù)字典信息。這個頁面用來存儲4個系統(tǒng)表的五個根頁面號(有5個索引)。
  普通用戶表的加載過程,當(dāng)用戶訪問一個表時,系統(tǒng)首先會從表對象緩沖池中查找這個表SHARE對象,如果找到,則直接從其實例化表對象空間鏈表中拿一個空閑的實例化的表對象使用,如果沒有一個可用的實例化對象,則需要重新打開(實例化這個表),在實例化這個表的時候,需要找到這個表的字典信息,包括這個表本身,列信息及索引信息等,這些信息很多都是從SHARE對象處獲得。如果沒有SHARE對象,則需要從系統(tǒng)表中構(gòu)造SHARE對象。
Rowid管理
  在InnoDB中,用戶表中的記錄不一定都會有一個Rowid列,Rowid只有在一個表沒有定義主鍵時,才會分配。而Rowid的管理分配,并不是一個表獨(dú)享一個ID空間,而是全局的,使用表都共享這個ID號。
  Rowid的分配并不會直接修改頁面,只要這個值為256的倍數(shù)的時候才會寫入一次。那么如果插入200次,這些值還沒有被寫入,這是系統(tǒng)重新啟動,ID號豈不是重復(fù)使用,因為數(shù)據(jù)庫啟動的時候會調(diào)用函數(shù)做一個工作,就是將上次寫入的Rowid值向上對齊256后在加上256,這樣就不會有問題了。

“怎么理解InnoDB數(shù)據(jù)字典”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI