5

私のデータベースには、50k、50k、5mの行を持つ3つのテーブルが含まれています。それらはすべてInnoDBです。(最大のものにはvarchar [256]が含まれています)。私のデータベースのサイズは214MBで、クエリで取得しましたinformation_schema.TABLES(これにより、ディスク上のデータとインデックスのサイズがわかりますか?)

1.5GBのRAMがあり、すべてのテーブルのエンジンをMEMORYに変換しようと思いました。しかし、最大のテーブルの変換を開始すると、1114エラーが発生しました。

max_heap_table_sizeいくつかの調査の結果、 16MBしかないことがわかりました。そこで、max_heap_table_sizetmp_table_sizeを1GBに設定しました。

もう一度変換しようとすると、mysqld.exeプロセスのメモリ使用量が1.2GBを超え、半分の行を変換する前に同じエラーが再びスローされました。最大のテーブルから行の半分を削除し、最終的には700MBのメモリに収まりました。

なぜ214MBのデータベースが、4倍以上のメモリに収まらないのですか?

プロセス内で、データとインデックス以外にメモリを消費しているものはありますか?

マシン:Intel P4-1.9GHz、1.5GB RAM、Win7Ultimate。

4

1 に答える 1

3

私はこのdba.seの質問を見つけました。そこでは、受け入れられた回答にこのdev.mysqlページへのリンクがありました。

MEMORYテーブルは、固定長の行ストレージ形式を使用します。VARCHARなどの可変長タイプは、固定長を使用して格納されます。

質問で述べたように、varchar[256]列が1つある5m行のテーブルがありました。

5,000,000 x 256 = 1.19G(1文字あたり1バイトと仮定)なので、それが答えだと思います。

その特定の列だけがスペースの95%に寄与し、残りは他の数値列からのものでした。InnoDBはそれを固定長でディスクに保存しなかったと思います。また、フィールドにはほとんど10〜15文字を超えないテスト値が含まれていたため、ディスク上で非常に小さなサイズを占めていました。

于 2012-09-28T06:39:59.553 に答える