文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


18.2.3.2 動態表格特性

如果 MyISAM 表格包含任何可變長度欄位(VARCHARVARBINARYBLOBTEXT),或者表格在建立時使用了 ROW_FORMAT=DYNAMIC 表格選項,則會使用動態儲存格式。

動態格式比靜態格式稍微複雜,因為每個資料列都有一個標頭,指示其長度。當更新導致資料列變長時,資料列可能會變成片段化(儲存在不連續的區塊中)。

您可以使用 OPTIMIZE TABLEmyisamchk -r 來整理表格碎片。如果您的表格中有固定長度的欄位,而且您經常存取或變更這些欄位,但表格也包含一些可變長度的欄位,那麼最好將可變長度的欄位移到其他表格,以避免碎片化。

動態格式表格具有以下特性:

  • 除了長度小於 4 的字串欄位之外,所有字串欄位都是動態的。

  • 每個資料列前面都有一個點陣圖,指示哪些欄位包含空字串(對於字串欄位)或零(對於數值欄位)。這不包括包含 NULL 值的欄位。如果字串欄位在移除尾隨空格後長度為零,或者數值欄位的值為零,則會在點陣圖中標記,且不會儲存到磁碟。非空字串會儲存為長度位元組加上字串內容。

  • NULL 欄位需要在資料列中額外空間來記錄其值是否為 NULL。每個 NULL 欄位會額外佔用一個位元,並向上取整到最接近的位元組。

  • 通常所需的磁碟空間比固定長度表格少得多。

  • 每個資料列只使用所需的空間。但是,如果資料列變大,則會分割成許多所需的區塊,導致資料列碎片化。例如,如果您更新的資料列資訊會延長資料列長度,則該資料列會變得片段化。在這種情況下,您可能需要不時執行 OPTIMIZE TABLEmyisamchk -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 TABLEmyisamchk -r 移除所有連結。