bucket-sort logo bucket-sort

プログラミングとインフラエンジニアリングの覚え書き

  • Posts
  • About
  • Contact
  1. Home
  2. All Posts
  3. MySQLでレコードの平均サイズを求める

MySQLでレコードの平均サイズを求める

Jan 8, 2026 MySQL , AWS bucket-sort

データベースのテーブルごとの容量を見積もる機会は、意外と多いです。

自前の MySQL サーバーで、かつ innodb_file_per_table=ON であれば、 テーブルごとの実ファイルサイズ(.ibd)を見ればある程度把握できます。しかし、Amazon RDS のようなマネージド環境ではファイルサイズを直接確認できません。

さらに、

  • JSON カラムを持つ
  • PHPクラスのシリアライズデータを格納している
  • 可変長テキストが多い

といったケースでは、レコードごとのサイズが均一ではありません。 レコード数が増えるほど、容量の見積もりは難しくなります。

そんなときは information_schema.tables を利用します。

information_schema で平均行長を確認する

MySQL にはテーブルの統計情報が保持されています。

SELECT
  table_schema,
  table_name,
  engine,
  table_rows,
  avg_row_length,
  data_length,
  index_length,
  data_free
FROM information_schema.tables
WHERE table_schema = '<db_name>'
  AND table_name = '<table_name>';

主なカラムの意味

カラム 意味
table_rows 推定レコード数(InnoDBでは概算)
avg_row_length 平均行長(バイト)
data_length データ領域サイズ(バイト)
index_length インデックスサイズ(バイト)
data_free 未使用領域

⚠️ 注意点
table_rows は InnoDB では「概算値」です。正確な件数ではありません。

実データ量ベースで平均サイズを計算する

avg_row_length も参考になりますが、
より直接的に確認したい場合は data_length / table_rows を計算します。

SELECT
  table_schema,
  table_name,
  table_rows,
  data_length,
  ROUND(data_length / NULLIF(table_rows, 0), 1) AS avg_row_bytes_est,
  index_length,
  ROUND(index_length / NULLIF(table_rows, 0), 1) AS avg_index_bytes_per_row_est
FROM information_schema.tables
WHERE table_schema = '<db_name>'
  AND table_name = '<table_name>';

これで分かること

  • 1レコードあたりの平均データサイズ(概算)
  • 1レコードあたりの平均インデックスサイズ(概算)
  • データ増加時のストレージ予測

例:

table_rows data_length avg_row_bytes_est
1,000,000 800,000,000 800 bytes

→ レコードが100万増えると、約800MB増えると推測できる。

注意点

table_rows は正確ではない

InnoDB では統計値です。
正確な件数を知りたい場合は:

SELECT COUNT(*) FROM <table_name>;

ただし巨大テーブルでは重くなります。

JSON や BLOB がある場合

  • レコードごとのサイズのばらつきが大きい
  • 実際の増加傾向とズレる可能性がある

大量投入前には、サンプルデータで試算するのが安全です。

data_free に注意

data_free が大きい場合は、

  • DELETE による断片化
  • OPTIMIZE TABLE 未実行

といった可能性があります。

まとめ

RDS ではファイルサイズを直接確認できませんが、 information_schema.tables を使えば、

  • 平均レコードサイズ
  • インデックス増加量
  • 将来の容量予測

を概算できます。

JSONやシリアライズデータを扱うテーブルでは特に有効です。

「レコードが増えたらどれくらい容量が増えるのか?」

これをざっくりでも把握できるだけで、ストレージ設計やRDSクラス選定の精度はかなり上がります。

MySQL RDS AWS 監視
← LaravelでDynamoDBを使うには?モジュールを調べてみた RDS MySQLとAurora MySQLをまたいでJOINできるのか調べてみた →

Related Posts

  • MySQLでレコードをDELETE / DROPしたらストレージ使用量は減るのか Jan 11, 2026
  • Aurora MySQLのメリットを整理してみた(RDS MySQLとの違い) Jan 10, 2026
  • RDS MySQLとAurora MySQLをまたいでJOINできるのか調べてみた Jan 9, 2026
  • MySQL vs Auroraベンチマーク比較 (sysbench / db.t3.medium) Feb 12, 2026

Table of Contents

  • information_schema で平均行長を確認する
    • 主なカラムの意味
  • 実データ量ベースで平均サイズを計算する
    • これで分かること
  • 注意点
    • table_rows は正確ではない
    • JSON や BLOB がある場合
    • data_free に注意
  • まとめ

Recent Posts

  • Laravel の Event / Listener で Pub/Sub を実装する Apr 2, 2026
  • [C#] delegate と event の仕組みを整理する Apr 1, 2026
  • Pub/Sub パターンとは何か Mar 31, 2026
  • PHP/Laravel で値の状態を判定するヘルパ関数まとめ Mar 30, 2026
  • Filament の dehydrated メソッドとは何か Mar 29, 2026

Categories

  • AWS27
  • C#22
  • .NET20
  • Laravel16
  • Linux12
  • Apache8
  • MySQL8
  • PHP8
  • DynamoDB6
  • Nginx5
  • WordPress4
  • インフラ4
  • Hugo3
  • セキュリティ3
  • .NET Framework1
  • Aurora1
  • Filament1
  • Git1
  • SQS1

Tags

  • AWS
  • C#
  • .NET
  • Laravel
  • PHP
  • MySQL
  • セキュリティ
  • Linux
  • Apache
  • Code Snippet
  • DynamoDB
  • NoSQL
  • PHP-FPM
  • RDS
  • DoS
  • Nginx
  • Windows
  • WordPress
  • パフォーマンス
  • 監視
  • Amazon Linux 2023
  • CMS
  • Docker
  • Ipset
  • Iptables
  • OPCache
  • Webサーバー
  • 認可
  • Aurora
  • Blade
Powered by Hugo & Explore Theme.