まだ中学生のブログ

スマホ関連、Google関連のことを書いてます。IT系勤務、既婚、精神年齢:中学生。

MySQLの容量見積もりでハマった

前回のエントリーでRDBMSの容量の見積もり方法を書きました。

RDBMSのインデックスサイズを無難に見積もる方法 - まだ中学生のブログ

ただ、ダミーデータを用意する際に気をつけないと、見積の誤差がとんでもないことになってしまうので、注意点をご紹介します。

MySQLにダミーデータを投入してサイズを見積もる際の注意点

MySQLのInnoDBというエンジンは、16kBを1ブロックとしてデータを扱うそうです。 よって、どんなにデータが少なくても、0でない以上は16kBとなります。

私は、20レコード30byte程度のデータを投入し、16kBであるという情報を得ていたので、レコード数の比で見積もり容量が跳ね上がっていました。 (100レコードにしたところで16kBである。)

実際の運用では1000000レコードだから

16KB x 1000000 / 20

と計算すると、実際より大きな値になってしまうのです。

次のコマンドでテーブルごとの実際のサイズを求めることができますが、

select
    table_name, 
    engine, 
    table_rows, 
    avg_row_length,  
    floor((data_length+index_length)) as all_Byte,  #総容量
    floor((data_length)) as data_Byte,  #データ容量
    floor((index_length)) as index_Byte   #インデックス容量
from
    information_schema.tables  
where
    table_schema=database()  
order by
    (data_length+index_length) desc

どのテーブルも16384byteを示していました。

テーブルサイズを見積もるためにダミーデータを投入してサイズを取得する際は、 ある程度のブロックを確保するくらいのレコード数を用意しましょう。