如果 MyISAM
表格包含任何可變長度欄位 (VARCHAR
、VARBINARY
、BLOB
或 TEXT
),或者表格是使用 ROW_FORMAT=DYNAMIC
表格選項建立的,則會使用動態儲存格式。
動態格式比靜態格式稍微複雜,因為每一列都有一個標頭,指示它的長度。當更新導致列變長時,列可能會變成碎片(儲存在不連續的片段中)。
您可以使用 OPTIMIZE TABLE
或 myisamchk -r 來整理表格碎片。如果您在一個也包含一些可變長度欄位的表格中,經常存取或變更固定長度欄位,最好將可變長度欄位移到其他表格,以避免產生碎片。
動態格式表格具有以下特性:
所有字串欄位都是動態的,長度小於 4 的除外。
每一列前面都有一個點陣圖,指示哪些欄位包含空字串(對於字串欄位)或零(對於數值欄位)。這不包括包含
NULL
值的欄位。如果字串欄位在移除尾隨空格後長度為零,或數值欄位的值為零,則會在點陣圖中標記,且不儲存到磁碟。非空字串會儲存為長度位元組加上字串內容。NULL
欄位需要額外的空間在列中記錄其值是否為NULL
。每個NULL
欄位會額外佔用 1 個位元,並向上四捨五入到最接近的位元組。通常比固定長度表格所需的磁碟空間少得多。
每一列僅使用所需的空間。然而,如果列變大,它會被分割成所需的多個片段,導致列碎片。例如,如果您使用會擴展列長度的資訊更新列,則該列會變成碎片。在這種情況下,您可能必須不時執行
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 來移除所有連結。