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