InnoDB的表空間分為共享表空間和獨(dú)立表空間,對(duì)于前者來說,數(shù)據(jù)存放在名為“ibdata1”的文件中。對(duì)于后者來說,各數(shù)據(jù)表的數(shù)據(jù)分散存儲(chǔ)后綴為“.idb”的不同文件中。在表空間文件中包含一行行的記錄,記錄是表空間的最小組成元素,這些記錄保存在頁(Page)當(dāng)中。頁包括Page header、一行行的記錄、Page trailer等部分組成。InnoDB引擎在運(yùn)作過程中,相應(yīng)的表空間和InnoDB Buffer Pool是緊密相關(guān)的,硬盤中的表空間文件和內(nèi)存中的緩存結(jié)構(gòu)是很相似的,即均以頁為單位來保存數(shù)據(jù)。頁容量通常為16KB,在一頁中會(huì)存儲(chǔ)多行記錄。64個(gè)頁可以組成一個(gè)Extent,最多四個(gè) Extent可以組成一個(gè)段(Segment)。
例如,對(duì)于InnoDB引擎的索引文件來說,一般由前置索引和后置索引組成,前者和后者都會(huì)消耗一個(gè)Extent。在初始階段,在段中可能會(huì)分配一些頁,之后會(huì)逐漸擴(kuò)張到一個(gè)Extent。隨后會(huì)逐步添加多個(gè)Extent。表空間文件由多個(gè)段組成,在其中包括前置索引、后置索引、RollBack信息等,因此,從組成結(jié)構(gòu)上說,表空間文件實(shí)際上由眾多的頁組成的。針對(duì)表空間文件的操作,本質(zhì)上是對(duì)頁進(jìn)行操作,例如,將多個(gè)頁讀取到緩存中,將頁中緩存中寫回表空間文件等。在MySQL數(shù)據(jù)庫運(yùn)轉(zhuǎn)過程中,頁的讀寫操作在頻繁地進(jìn)行。所以,表空間文件的損壞,也經(jīng)常發(fā)生在此環(huán)節(jié)中。