如果 MyISAM
表格包含任何可變長度欄位(VARCHAR
、VARBINARY
、BLOB
或 TEXT
),或者表格在建立時使用了 ROW_FORMAT=DYNAMIC
表格選項,則會使用動態儲存格式。
動態格式比靜態格式稍微複雜,因為每個資料列都有一個標頭,指示其長度。當更新導致資料列變長時,資料列可能會變成片段化(儲存在不連續的區塊中)。
您可以使用 OPTIMIZE TABLE
或 myisamchk -r 來整理表格碎片。如果您的表格中有固定長度的欄位,而且您經常存取或變更這些欄位,但表格也包含一些可變長度的欄位,那麼最好將可變長度的欄位移到其他表格,以避免碎片化。
動態格式表格具有以下特性:
除了長度小於 4 的字串欄位之外,所有字串欄位都是動態的。
每個資料列前面都有一個點陣圖,指示哪些欄位包含空字串(對於字串欄位)或零(對於數值欄位)。這不包括包含
NULL
值的欄位。如果字串欄位在移除尾隨空格後長度為零,或者數值欄位的值為零,則會在點陣圖中標記,且不會儲存到磁碟。非空字串會儲存為長度位元組加上字串內容。NULL
欄位需要在資料列中額外空間來記錄其值是否為NULL
。每個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 找到連結數。可以使用
OPTIMIZE TABLE
或 myisamchk -r 移除所有連結。