MyISAM表的儲存格式---行格式

守護大白菜發表於2017-04-13
 MyISAM表的儲存格式
1. 靜態(固定長度)表特徵

2. 動態表特徵

3. 已壓縮表特徵


MyISAM支援三種不同儲存格式。其中兩個(固定格式和動態格式)根據正使用的列的型別來自動選擇。第三個,即已壓縮格式,只能使用myisampack工具來建立。

當你CREATE或ALTER一個沒有BLOB或TEXT列的表,你可以用ROW_FORMAT表選項強制表的格式為FIXED或DYNAMIC。這會導致CHAR和VARCHAR列因FIXED格式變成CHAR,或因DYNAMIC格式變成VARCHAR。 

通過用ALTER TABLE指定ROW_FORMAT={COMPRESSED | DEFAULT},你可以壓縮或解壓縮表,請參閱13.1.5節,“CREATE TABLE語法”。 

1. 靜態(固定長度)表特徵(FIXED)
靜態格式是MyISAM表的預設儲存格式。當表不包含變數長度列(VARCHAR, BLOB, 或TEXT)時,使用這個格式。每一行用固定位元組數儲存。 

MyISAM的三種儲存格式中,靜態格式就最簡單也是最安全的(至少對於崩潰而言)。靜態格式也是最快的on-disk格式。快速來自於資料檔案中的行在磁碟上被找到的容易方式:當按照索引中的行號查詢一個行時,用行長度乘以行號。同樣,當掃描一個表的時候,很容易用每個磁碟讀操作讀一定數量的記錄。 

當MySQL伺服器正往一個固定格式MyISAM檔案寫的時候,如果計算機崩潰了,安全是顯然的。在這種情況下,myisamchk可以容易地決定每行從哪裡開始到哪裡結束,所以它通常可以收回所有記錄,除了寫了一部分的記錄。注意,基於資料行,MyISAM表索引可以一直被重新構建。

靜態格式表的一般特徵:

·         CHAR列對列寬度是空間填補的。

·         非常快。

·         容易快取。

·         崩潰後容易重建,因為記錄位於固定位置。 

·         重新組織是不必要的,除非你刪除巨量的記錄並且希望為作業系統騰出磁碟空間。為此,可使用OPTIMIZE TABLE或者myisamchk -r。 

·         通常比動態格式表需要更多的磁碟空間。

2. 動態表特徵(DYNAMIC)
如果一個MyISAM表包含任何可變長度列(VARCHAR, BLOB或TEXTDynamic),或者如果一個表被用ROW_FORMAT=DYNAMIC選項來建立,動態儲存格式被使用。

這個格式更為複雜一點,因為每行有一個表明行有多長的頭。當一個記錄因為更新的結果被變得更長,該記錄也可以在超過一個位置處結束。

你可以使用OPTIMIZE TABLE或myisamchk來對一個表整理碎片。如果在一個表中有你頻繁訪問或改變的固定長度列,表中也有一些可變長度列,僅為避免碎片而把這些可變長度列移到其它表可能是一個好主意。

動態格式表的一般特徵:

·         除了長度少於4的列外,所有的字串列是動態的。 

·         在每個記錄前面是一個點陣圖,該點陣圖表明哪一列包含空字串(對於字串列)或者0(對於數字列)。注意,這並不包括包含NULL值的列。如果一個字元列在拖曳空間移除後長度為零,或者一個數字列為零值,這都在點陣圖中標註了且列不被儲存到磁碟。 非空字串被存為一個長度位元組加字串的內容。

·         通常比固定長度表需要更少的磁碟空間。

·         每個記錄僅使用必需大小的空間。儘管如此,如果一個記錄變大,它就按需要被分開成多片,造成記錄碎片的後果。比如,你用擴充套件行長度的資訊更新一行,該行就變得有碎片。在這種情況下,你可以時不時執行OPTIMIZE TABLE或myisamchk -r來改善效能。可使用myisamchk -ei來獲取表的統計資料。

·         動態格式表在崩潰後要比靜態格式表更難重建,因為一個記錄可能被分為多個碎片且連結(碎片)可能被丟失。 

·         動態尺寸記錄期望的行長度用下列表示式來計算: 

·                3
·                + (number of columns + 7) / 8
·                + (number of char columns)
·                + (packed size of numeric columns)
·                + (length of strings)
·                + (number of NULL columns + 7) / 8
對每個連結需要額外的6位元組。在一個更新導致一個記錄的擴大之時,一個動態記錄被連結了。每個新連結至少是20位元組,所以下一個擴大可能在同樣的連結裡進行。如果不是,則另一個連結將被建立。你可以使用myisamchk -ed來找出連結的數目。所有的連結可以用myisamchk -r來移除。

相關文章