原文: 🚀 Lightning-Fast Archiving in MySQL HeatWave Using Table Partition Exchange

大規模なデータセットの管理では、パフォーマンスとストレージのバランスを取ることが重要です。「ホット」データをスリムに保つことは、速度とメモリ効率に不可欠です。一方で、保持が必要な「コールド」データはどのように扱えばよいでしょうか。

Partition Exchange Archiving は、行を書き換えたり大規模なロックを発生させたりすることなく、古いデータをプライマリ・テーブルから即座に移動できる、シンプルで本番環境向けの戦略です。スマートにアーカイブするための方法です。

🔥 MySQL HeatWaveとは

MySQL HeatWave は、トランザクション、分析、Lakehouse、機械学習、生成AIを、MySQL互換の単一エンジンに統合したフルマネージドのMySQLサービスです。超並列のインメモリ・エンジンを使用して分析クエリを高速化し、個別のETLパイプラインや外部データ・ウェアハウスを不要にします。

🧠 戦略: メタデータのみのアーカイブ

このパターンでは、MySQLが持つ、テーブル・パーティションを非パーティション・テーブルと交換する機能を活用します。物理的な行コピーを伴わないメタデータのみの操作であるため、高速です。

大まかな流れは次のとおりです。

  1. テーブルを RANGE(order_date) でパーティション化する
  2. 古いパーティションをアーカイブ・テーブルと交換する
  3. アーカイブをディスクまたはオブジェクト・ストレージへダンプする(バックアップ手順)
  4. アーカイブ済みテーブルを TRUNCATE する(クリーンアップ手順)

⚙️ ステップごとの実装

✅ 1. パーティション化テーブルを作成する

まず、ライブの orders テーブルを定義し、order_date を基準に月単位でパーティション化します。ここでは、構成をシンプルに保つために単一の AUTO_INCREMENT 主キーを使用します。

SQL:

CREATE TABLE orders (
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  order_date DATE NOT NULL,
  customer_id INT NOT NULL,
  total DECIMAL(10, 2) NOT NULL
)
PARTITION BY RANGE (TO_DAYS(order_date)) (
  PARTITION p202201 VALUES LESS THAN (TO_DAYS('2022-02-01')),
  PARTITION p202202 VALUES LESS THAN (TO_DAYS('2022-03-01')),
  PARTITION p202203 VALUES LESS THAN (TO_DAYS('2022-04-01')),
  PARTITION pmax    VALUES LESS THAN (MAXVALUE)
);

💡 TO_DAYS(order_date) でパーティション化することで、レンジ境界の一貫性を確保できます。

🔢 サンプル・データを投入する

SQL:

INSERT INTO orders (order_date, customer_id, total) VALUES
('2022-01-15', 1, 100.00),
('2022-01-20', 2, 200.00),
('2022-02-01', 3, 300.00),
('2022-02-15', 4, 400.00),
('2022-03-01', 5, 500.00);

🗄️ 2. アーカイブ・テーブルを作成する(インデックスなし)

orders テーブルから、常に成立しない条件で選択するというシンプルな方法でアーカイブ・テーブルを作成します。これにより、コールド・ストレージやエクスポートに適した、非パーティションかつインデックスなしのクローンを作成できます。

SQL:

-- Create archive table with same structure, no data or indexes
CREATE TABLE orders_archive AS SELECT * FROM orders WHERE NULL;

これにより、次の状態になります。

  • ✅ 同一の列
  • ❌ 行なし
  • ❌ インデックスなし
  • ❌ パーティションなし
  • EXCHANGE PARTITION に完全対応

⚡ 3. パーティションを交換する(瞬時かつロックを抑制)

次に、メタデータのみの操作を使用して、1か月分のデータ全体をアーカイブ・テーブルへ瞬時に移動します。

SQL:

ALTER TABLE orders EXCHANGE PARTITION p202201 WITH TABLE orders_archive WITH VALIDATION;

注意点:

  • WITH VALIDATION は、正しいレンジの行だけが交換されることを確認します。
  • 事前にレンジを検証済みのパフォーマンス重視パイプラインでは、WITHOUT VALIDATION を使用できます。

🧪 4. 交換結果を検証する

交換後、対象パーティションが空になり、アーカイブ・テーブルに正しいデータが含まれていることを確認します。

SQL:

-- Check that the partition is now empty
SELECT PARTITION_NAME, TABLE_ROWS
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_NAME = 'orders';

-- Check the archive table
SELECT COUNT(*) FROM orders_archive;
SELECT MIN(order_date), MAX(order_date) FROM orders_archive;

💾 5. アーカイブをバックアップする(Jump VM上のMySQL Shell)

これは省略してはいけないバックアップ・メカニズムです。

アーカイブ・テーブルに古いデータが格納されたら、Jump VM上のMySQL Shellを使用して、ディスクまたはクラウド・ストレージへダンプできます。

MySQL Shell(JSモード)では、次のように実行します。

JS:

util.dumpTables(
  "test_arch",             /* schema */
  ["orders_archive"],      /* tables */
  "/Folder/BackupFolder/", /* dump target; could be a bucket mount or local path */
  { threads: 4, ocimds: true, compatibility: ["strip_definers"] }
);

これは次をサポートします。

  • ✅ ローカル・ディスク
  • ✅ マウント済みNFS / FUSE経由のOCIバケット
  • ✅ インスタンス・プリンシパルを使用したOCI Object Storageへの直接アップロード(ocimds: true

🧹 6. クリーンアップする、またはLakeへ流す(TRUNCATEメカニズム)

アーカイブが安全にバックアップされたら、同じアーカイブ・テーブルを再利用できるように領域を解放できます。

SQL:

TRUNCATE TABLE orders_archive;

この時点で、次の状態になります。

  • ライブ・パーティション(例: 2022年1月)は EXCHANGE によって空になっています。
  • 履歴データはディスクまたはオブジェクト・ストレージへバックアップされています。
  • アーカイブ・テーブルは再び空になり、次回のパーティション交換に備えられています。

🚀 MySQL HeatWaveでこの方法が有効な理由

  • ⚡ 瞬時のパフォーマンス: EXCHANGE PARTITION はメタデータのみの操作です。
  • 💪 ロックに強い: 長時間実行される DELETE や行単位のアーカイブ・ジョブを回避できます。
  • 🧠 メモリ効率が高い: インメモリ・テーブルが小さくなるほど、HeatWave分析は高速になります。
  • 🔁 自動化しやすい: 月次イベントとMySQL Shellジョブを組み合わせることで、手間のかからないアーカイブを実現できます。
  • 📜 コンプライアンスに対応しやすい: 規制当局に対して明確で反復可能なアーカイブ戦略を示せます。

よりスマートに、より高速にアーカイブを始めましょう。🔨🤖🔧