MySQL TEXT列のストレージ要件

MySQL TEXT列のストレージ要件

errormsg2MyISAM ストレージ エンジンを使用して、約 12 個の列を持つという MySQL テーブルがあります。

これらの列のうち 2 つは、各行に使用されるスペースの大部分を占めると推定され、データ型は TEXT です。これらはbacktraceとですmsg

各行に必要なストレージの量を見積もろうとしたところ、次のような矛盾に遭遇しました。

show table status where name = 'errormsg2';(data_length + index_length) / rows1 行あたり約 778 バイトであることがわかります。

select avg( bit_length( em.backtrace ) + bit_length( em.msg ) ) / 8 from errormsg2 em;これら 2 つの列からのみ、行あたり平均 899 バイトのテキストが表示されます。

テーブルが使用するデータよりも多くのデータを保存するのはなぜでしょうか? 何が足りないのでしょうか?

答え1

考慮すべきことの 1 つは、エンコードの問題です。たとえば、UTF-8 では一部の文字に 5 バイトを使用します。データがない場合、または可変データの場合、データベースは最悪の事態を想定しざるを得ません。つまり、すべての文字の長さが 5 バイトになる可能性があるということです。そのため、実際に必要な量よりも多くのバイトが割り当てられる可能性があります。

UTF-16は2バイトしかないと言われていますが、同じ種類の問題に陥る可能性があることに注意してください。UTF-16は4バイトの長さのサロゲートペアをエンコードする必要があります。UTF-16には他にも多くの問題があり、いくつかの常にUTF-8の使用を推奨する

関連情報