本篇內(nèi)容介紹了“怎么理解InnoDB數(shù)據(jù)字典”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名注冊(cè)、虛擬主機(jī)、營(yíng)銷軟件、網(wǎng)站建設(shè)、耒陽(yáng)網(wǎng)站維護(hù)、網(wǎng)站推廣。
在InnoDB中,系統(tǒng)表實(shí)際上是看不到的,不像Oracle那樣可以方便地通過(guò)一個(gè)查詢語(yǔ)句就能得到其中的內(nèi)容。因?yàn)镸ySQL是一個(gè)插件式的數(shù)據(jù)庫(kù)管理系統(tǒng)。它的結(jié)構(gòu)分為兩層,分別是Server層和存儲(chǔ)引擎層。最早的存儲(chǔ)引擎是MyISAM,它是沒(méi)有數(shù)據(jù)字典的,關(guān)于表結(jié)構(gòu),它擁有的只有.frm文件,所以這導(dǎo)致了InnoDB也必須要有這個(gè)文件才使得Server層識(shí)別并管理它。對(duì)于Server層,一個(gè)表是什么存儲(chǔ)引擎,這是表的屬性。具體深入到每一個(gè)存儲(chǔ)引擎內(nèi)部,數(shù)據(jù)字典就不被Server層來(lái)管理了,這就導(dǎo)致數(shù)據(jù)字典不能被用戶感知了。
系統(tǒng)表結(jié)構(gòu)
InnoDB有四個(gè)最基本的系統(tǒng)表,用來(lái)存儲(chǔ)用戶定義的表,列,索引及索引列等信息,這些表分別為SYS_TABLES,SYS_COLUMNS,SYS_INDEXES,SYS_FIELDS。
SYS_TABLES
用來(lái)存儲(chǔ)所有InnoDB為存儲(chǔ)引擎的表
NAME:表示一個(gè)表的表名
ID:表示這個(gè)表的ID號(hào)
N_COLS:表示這個(gè)表的列的個(gè)數(shù),建表指定的列數(shù)。
TYPE:表示這個(gè)表的存儲(chǔ)類型,包括記錄的格式,壓縮等信息。
SPACE:表示這個(gè)表所在表空間ID號(hào)。這個(gè)表對(duì)應(yīng)的主鍵列為NAME,同時(shí)還有一個(gè)在ID號(hào)上的唯一索引。
SYS_COLUMNS
用來(lái)存儲(chǔ)InnoDB中定義的所有表中所有列的信息,每一列對(duì)應(yīng)這個(gè)表的一條記錄。
TABLE_ID:表示這個(gè)列所屬的表的ID號(hào)
POS:表示這個(gè)列在表中是第幾列。
NAME:表示這個(gè)列名。
MTYPE:表示這個(gè)列的主數(shù)據(jù)類型。
PRTYPE:表示這個(gè)列的一些精確數(shù)據(jù)類型,它是一個(gè)組合值,包括NULL標(biāo)志,是否有符號(hào)數(shù)的標(biāo)志,是否是二進(jìn)制字符串的標(biāo)志及表示這個(gè)列是真的varchar
LEN:表示這個(gè)列數(shù)據(jù)的精度,目前沒(méi)有用到。
SYS_INDEXES
用來(lái)存儲(chǔ)InnoDB中所有表的索引信息,每一條記錄對(duì)應(yīng)一個(gè)索引
TABLE_ID:表示這個(gè)索引所屬的表的ID號(hào)。
ID:表示這個(gè)索引的索引ID號(hào)
NAME:表示這個(gè)索引的索引名
N_FIELDS:表示這個(gè)索引包括的列個(gè)數(shù)。
TYPE:表示這個(gè)索引的類型,包括聚簇索引,唯一索引,等
SPACE:表示這個(gè)索引數(shù)據(jù)所在的表空間ID號(hào)
PAGE_NO:表示這個(gè)索引對(duì)應(yīng)的B+樹(shù)根頁(yè)面。
SYS_FIEDS
用來(lái)存儲(chǔ)所有索引中定義的索引列,每一條記錄對(duì)應(yīng)一個(gè)索引列。
INDEX_ID:這個(gè)列所在的索引
POS:這個(gè)列在某個(gè)索引中是第幾個(gè)索引列
COL_NAME:這個(gè)索引列的列名。
字典表的加載
InnoDB啟動(dòng)的時(shí)候,如果是新建數(shù)據(jù)庫(kù),則需要初始化庫(kù),索引需要?jiǎng)?chuàng)建字典管理的B+樹(shù)信息。因?yàn)镮nnoDB中的系統(tǒng)表的結(jié)構(gòu),個(gè)數(shù)等都是固定的,所以在初始化庫(kù)的時(shí)候只需要?jiǎng)?chuàng)建這幾個(gè)表的存儲(chǔ)B+樹(shù)即可。同時(shí)把將這幾個(gè)B+樹(shù)的根頁(yè)號(hào)存儲(chǔ)在一個(gè)固定位置,就不需要將這幾個(gè)表自身的信息存儲(chǔ)在系統(tǒng)表中了。對(duì)于一個(gè)B樹(shù),只要找到其根頁(yè)面,就可以找檢索其數(shù)據(jù)了。
對(duì)于數(shù)據(jù)字典表根頁(yè)面位置的存儲(chǔ)方式,InnoDB用了一個(gè)專門的頁(yè)面(0號(hào)表空間0號(hào)文件的7號(hào)頁(yè)面)來(lái)管理數(shù)據(jù)字典信息。這個(gè)頁(yè)面用來(lái)存儲(chǔ)4個(gè)系統(tǒng)表的五個(gè)根頁(yè)面號(hào)(有5個(gè)索引)。
普通用戶表的加載過(guò)程,當(dāng)用戶訪問(wèn)一個(gè)表時(shí),系統(tǒng)首先會(huì)從表對(duì)象緩沖池中查找這個(gè)表SHARE對(duì)象,如果找到,則直接從其實(shí)例化表對(duì)象空間鏈表中拿一個(gè)空閑的實(shí)例化的表對(duì)象使用,如果沒(méi)有一個(gè)可用的實(shí)例化對(duì)象,則需要重新打開(kāi)(實(shí)例化這個(gè)表),在實(shí)例化這個(gè)表的時(shí)候,需要找到這個(gè)表的字典信息,包括這個(gè)表本身,列信息及索引信息等,這些信息很多都是從SHARE對(duì)象處獲得。如果沒(méi)有SHARE對(duì)象,則需要從系統(tǒng)表中構(gòu)造SHARE對(duì)象。
Rowid管理
在InnoDB中,用戶表中的記錄不一定都會(huì)有一個(gè)Rowid列,Rowid只有在一個(gè)表沒(méi)有定義主鍵時(shí),才會(huì)分配。而Rowid的管理分配,并不是一個(gè)表獨(dú)享一個(gè)ID空間,而是全局的,使用表都共享這個(gè)ID號(hào)。
Rowid的分配并不會(huì)直接修改頁(yè)面,只要這個(gè)值為256的倍數(shù)的時(shí)候才會(huì)寫入一次。那么如果插入200次,這些值還沒(méi)有被寫入,這是系統(tǒng)重新啟動(dòng),ID號(hào)豈不是重復(fù)使用,因?yàn)閿?shù)據(jù)庫(kù)啟動(dòng)的時(shí)候會(huì)調(diào)用函數(shù)做一個(gè)工作,就是將上次寫入的Rowid值向上對(duì)齊256后在加上256,這樣就不會(huì)有問(wèn)題了。
“怎么理解InnoDB數(shù)據(jù)字典”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!