多くの開発者はデータベースエンジンを黒箱として扱います:クエリを書けば、データが魔法のように返ってきます。しかし、データが数百万行に達すると、そのデータが物理的なハードウェア上にどのように存在するかを理解することは、システムを構築する方法を変えます。
すべてのデータをデフォルトのデータベース設定に投げ込めば、最終的にはストレージコストが急激に増加し、クエリの速度が遅くなります。
スケーラブルなシステムを構築するためには、完全に相反する二つのストレージ哲学を理解する必要があります:ページベーストランザクショナルストレージ(InnoDB)とストリームベース圧縮ストレージ(ARCHIVE)、そしてそれらがどのように接続しているかテーブルパーティショニング.
1. インナボーンハイアラーシ(バイトからテーブルスペースへ)
MySQLのデフォルトエンジンであるInnoDBは、高速性、マルチユーザー正確性、重い読み書きトラフィックに対応して設計されています。それは単に生のテキスト文字列をファイルに追記するだけではありません。高度に構造化された厳格なマルチレベルの階層を通じてデータを管理します.
ストレージスタック
-
テーブルスペース: これは最高の論理コンテナです。モダンな設定(例えば)を有効にした場合
innodb_file_per_table、各々のデータベーステーブルはハードドライブ上に独自の物理.ibdファイルを持っています。 - 拡張子: テーブルをドライブの異なる物理セクタに散らばらせないように、InnoDBは拡張子と呼ばれるチャンクでスペースを割り当てます。各拡張子は正確に1メガバイトです。 のサイズで複数の連続ページをまとめ、順次データが物理的にディスク上で近くに留まることを保証します。
- ページ: では、Page がInnoDBが実際に作業を行う基本的な原子単位です。デフォルトでは、InnoDBページは正確に16キロバイトです。InnoDBがデータを読み書きするたびに、それをロードします。16KBページ全体をサーバーのRAM(バッファプール)にロードする場合、たとえ単一の行だけを要求したとしても
- 行: この構造の絶対的な基盤には個々の行があり、データページ内に緊密に詰め込まれています。InnoDBはクラスタインデックスB+木を使用しているため、あなたの行は物理的にプライマリキーでソートされ、ディスク上に格納されます。
2. アーカイブエンジン(アンチページアプローチ)
データを更新する必要がない場合、どうすればいいでしょうか?システムログ、クリックストリーム、または何か問題が発生したときにだけ確認する数十億ものア auditr ーを保管している場合、どうすればいいでしょうか?
それを InnoDB に投入することは非常に無駄です。インデックスツリーと 16KB ページ構造がディスク使用量を増加させるからです。The ARCHIVE engineは、この正確な問題を解決するためにInnoDBの設計を完全に覆している:
-
固定ページなし:厳密な16KBブロックにデータを構造化する代わりに、ARCHIVEはデータを連続的で無制限の追記のみ可能なバイナリバイトストリームとして扱い、
.arzファイル内に保存している。 -
動的ストリーム圧縮: データが挿入されると、メモリ内の圧縮バッファを通過します。末尾のスペースは削除され、最適化されたビットヘッダが
NULL値を処理します。その後、生の行はディスクに書き込まれる前にzlibアルゴリズムを使用してオンザフライで圧縮されます。 -
インデックスのトレードオフ: ミニマルなフットプリントを維持するために、ARCHIVEは ゼロの二次インデックスを許可します許される唯一のインデックスは一つです
AUTO_INCREMENTカラム。
テキストの生の圧縮された文字列として機能するためではなく、インデックス化されたブロック構造としてではなく、ARCHIVEは通常的に達成します3:1から10:1の圧縮率InnoDBと比較すると。
3. アーキテクチャ比較表
| 建築的特徴 | InnoDBエンジン | アーカイブエンジン |
|---|---|---|
| ストレージレイアウト | 厳密な16KBページ / 1MBエクステント | 連続的zlib圧縮されたバイトストリーム |
| 主要ファイルフォーマット |
.ibd(データ+インデックスを組み合わせた) |
.arz(データ)+.frm(メタデータ) |
| 書き込みモデル | B+木挿入、ページ分割 | メモリバッファ経由の追記のみストリーム |
| サポートされる変異 |
INSERT、SELECT、UPDATE、DELETE
|
INSERT、SELECTのみ(WORMモデル) |
| ロック機構 | 粒度細かい行ロック(MVCC) | 交錯行ストリームロック |
4. 世界をつなぐ:テーブルパーティショニング& 交換
両方のエンジンを理解した今、これらの精神的モデルを組み合わせて、ホット/コールド データ タイリング システムを作成できます。目標は単純です:最近のデータ(ホット)を InnoDB に保持して、迅速に更新およびインデックス化できるようにします。古いデータ(コールド)を代替ストレージに移動して、ディスクスペースを節約します。
MySQLでは単一のパーティション化されたテーブル内でストレージエンジンを混在させることができないため、パーティション交換という戦略を使用します。これはメタデータのみのスワップで、数百万行を1秒未満で転送します.
ステップA: パーティション化されたInnoDBテーブルを作成
私たちはタイムスタンプや日付を使用してアクティブなInnoDBテーブルを月ごとにパーティション化します
CREATE TABLE system_logs (
log_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
log_date DATE NOT NULL,
subsystem VARCHAR(50) NOT NULL,
message TEXT NOT NULL,
PRIMARY KEY (log_id, log_date)
) ENGINE=InnoDB
PARTITION BY RANGE (TO_DAYS(log_date)) (
PARTITION p_past_month VALUES LESS THAN (TO_DAYS('2026-05-01')),
PARTITION p_current_month VALUES LESS THAN (TO_DAYS('2026-06-01')),
PARTITION p_future VALUES LESS THAN MAXVALUE
);
ステップB:インスタントパーティション交換
月が終わると、その古いデータを圧縮したい。大規模な DELETE ステートメントを実行すると、テーブルがロックされ、CPUが過負荷になる。代わりに、空の同じInnoDBステージングテーブルを作成し、すぐに古いパーティションを交換する:
-- 1. Create a temporary staging table matching the schema
CREATE TABLE system_logs_stage LIKE system_logs;
ALTER TABLE system_logs_stage REMOVE PARTITIONING;
-- 2. Instantly swap the old partition into the staging table (Takes < 1 second)
ALTER TABLE system_logs EXCHANGE PARTITION p_past_month WITH TABLE system_logs_stage;
-- 3. Drop the now empty partition from the active table
ALTER TABLE system_logs DROP PARTITION p_past_month;
ここから、system_logs_stageの内容を直接ARCHIVEにバックされたテーブルにパイプして、あなたの冷蔵ログをデータベース内でネイティブに圧縮し続けることができます
5. 生産現実の確認:業界の現在の状況
パーティション交換が実際に生産で使用されているか?はい、毎日1日中。 ライブテーブルをロックせずに歴史データをドロップまたは隔離するための金の標準です。
しかし、ARCHIVEエンジンはストリーム圧縮のための素晴らしいアーキテクチャブループリントであるが、現代のクラウドインフラチームは通常「冷蔵」階層化を異なる方法で処理しています。今日、プロダクションデータベースストレージとIOPS(1秒あたりの入出力操作数)は非常に高価です。エンジニアは、圧縮されていても、冷蔵の歴史的なログデータが同じライブプロダクションデータベースインスタンスに置かれるのを望みません。
代わりに、企業はデータパーティション交換を使用して古いデータをステージングテーブルに隔離し、MySQLから完全にストリーミングして、超圧縮の列形式のApache Parquetファイルとしてクラウドデータレイク(AWS S3など)にフォーマットし、その後ステージングテーブルを完全に削除します。これにより、ライブプロダクションデータベースがスリーン、速く、運用コストも驚くほど安くなります。
結論
サイドプロジェクトを構築している場合やソフトウェアエンジニアリングコースを進めている場合、標準的なデータベース設定にデフォルト設定にするのが簡単です。しかし、内部を見ることでアプリケーションのパフォーマンスに取り組む方法が変わります。
InnoDBの厳格なページ割り当てとARCHIVEの流動的な圧縮ストリームの間の緊張関係を理解することは、データアクセスパターンを批判的に考えるのに役立ちます - 適切なストレージ戦略を適切なワークロードに合わせることは、標準的なCRUDアプリケーションを書くだけでなく、最適化された、本番用のシステムをエンジニアリングする方法です。












