我有一個名為「使用 MyISAM 儲存引擎」的 MySQL 表,errormsg2
其中包含大約十幾個欄位。
我估計其中兩列佔據了每行使用的大部分空間,並且它們的資料類型為 TEXT。他們是backtrace
和msg
。
我試圖估計每行所需的儲存量,但發現了以下矛盾:
show table status where name = 'errormsg2';
顯示(data_length + index_length) / rows
每行大約 778 位元組。
select avg( bit_length( em.backtrace ) + bit_length( em.msg ) ) / 8 from errormsg2 em;
僅顯示這兩列中每行平均 899 位元組的文字。
表儲存的資料怎麼可能比它使用的資料多?我缺什麼?
答案1
需要考慮的一件事是編碼問題。例如,UTF-8 對某些字元使用 5 個位元組。如果沒有數據或變數數據,資料庫將被迫假設最壞的情況:每個字元的長度可能是 5 個位元組。因此,它可能會分配比實際需要使用的更多的資源。
請注意,UTF-16 雖然據稱只有 2 個位元組,但也可能遇到相同類型的問題:它必須對 4 個位元組長的代理項對進行編碼。 UTF-16 還有多個其他問題,並且一些提倡始終使用 UTF-8