如果一個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來移除。