In-Memory Column Index (IMCI) は、PolarDB for MySQL に列ストアとインメモリコンピューティングレイヤーを追加することで、オンラインライントランザクション処理 (OLTP) のパフォーマンスを犠牲にしたり、データを移行したりすることなく、単一のクラスターで Hybrid Transactional and Analytical Processing (HTAP) を実現します。
MySQL が列ストアを必要とする理由
MySQL は、単一行の検索、同時書き込み、低レイテンシートランザクションといったオンラインライントランザクション処理 (OLTP) 向けに設計されました。PolarDB クラスターが数百テラバイトのデータを日常的に格納するようになると、ユーザーはアプリケーションを駆動する同じデータに対してリアルタイム分析を行う必要性がますます高まっています。これに対応するため、3つのアーキテクチャアプローチが登場しました。
MySQL + 専用 AP データベース
OLTP 用の MySQL と分析用の専用オンライン分析処理 (OLAP) データベースという2つの独立したシステムをデプロイし、その間に同期パイプラインを構築します。各ワークロードに最適なエンジンを利用できますが、コストは高くなります。2つの技術スタックを維持する必要があり、同期遅延によって分析データが古くなり、リアルタイムの一貫性を確保する簡単な方法もありません。

複数レプリカによる分岐設計
TiDB (バージョン 4.0 以降) のような分散 NewSQL データベースは、各 Raft グループ内の異なるレプリカに異なるストレージフォーマットを割り当てます。1つのレプリカは列ストアである TiFlash を実行して分析クエリを処理し、他のレプリカは OLTP を処理します。インテリジェントなクエリルーティングが適切なレプリカを自動的に選択します。これは新規デプロイメントには適していますが、MySQL からの移行が必要となり、互換性の問題が発生します。

統合型ハイブリッド行列表ストア
最も先進的なアプローチは、行指向データと列指向データの両方を同じデータベースインスタンスに格納するものです。主要な商用データベースはすべてこの設計を採用しています。
Oracle は、Oracle Database 12c (2013) で Database In-Memory スイートを導入しました。これは、インメモリ列ストアとハイブリッド行列実行、およびマテリアライズされた式と JoinGroup に基づくクエリ最適化を使用しています。
SQL Server は、SQL Server 2016 SP1 で列ストアインデックスを追加し、行指向テーブル、列指向テーブル、およびハイブリッドの組み合わせをサポートしました。
IBM Db2 は、Kepler 10.5 (2013) で BLU Acceleration を出荷し、列ストア、インメモリコンピューティング、データスキッピングを組み合わせました。

これら 3つの主要な商用データベースが同じ設計に収束したのには、共通の理由があります。列ストアは、I/O 効率 (圧縮、データスキッピング、列プルーニング) と CPU 効率 (キャッシュフレンドリーなアクセスパターン) の両方を向上させます。しかし、列ストアインデックスはスパースであり、B+ ツリーインデックスのように個々の行を効率的に特定することはできません。ハイブリッド行列エンジンはこの問題を解決します。行ストアが正確な行レベルのインデックスで OLTP を処理し、列ストアがバルク分析スキャンを高速化します。DRAM の低レイテンシーが、列ストア更新におけるパフォーマンスギャップを補います。
PolarDB が新しい実行エンジンを必要とした理由
PolarDB の機能スタックは、オープンソースの MySQL を反映しています。PolarDB は OLTP を効率的に処理し、クラスターあたり最大 500 TB のデータをサポートしますが、複雑な分析クエリは依然として低速です。このボトルネックは、MySQL のアーキテクチャに起因する根本的なものです。
シリアル実行モデル:MySQL の Volcano イテレータモデルは、一度に1行ずつ処理します。各行の取得は、仮想関数ディスパッチを含む複数レイヤーの関数呼び出しをトリガーします。これにより、CPU パイプライン効率が損なわれ、SIMD 命令の使用が妨げられます。
パラレルクエリの非対応:MySQL のエグゼキュータはシングルスレッドです。MySQL 8.0 のパラレルクエリサポートは
COUNT(*)のような基本操作のみをカバーしており、利用可能な CPU コアの数に関係なく、複雑な分析 SQL はシリアルに実行されます。行ストアの I/O の無駄:分析クエリが 50 列のテーブルから 3 列しか必要としない場合でも、MySQL はディスクから 50 列すべてを読み取ります。行ストアフォーマットは、本質的に選択的な列アクセスを非効率にします。
PolarDB のパラレルクエリフレームワークは、スキャン処理を複数のスレッドに分散し、結果をメインスレッドで集約することで、CPU のボトルネックに対処します。

パラレルクエリはシングルコアの制約を打ち破り、スキャン負荷の高いワークロードのクエリ時間を短縮します。しかし、行ストアの I/O 非効率性が上限となり、並列実行だけでは克服できません。その上限を取り除くには、列ストアが必要です。
列ストアは、2つのレベルでパフォーマンスを向上させます。
I/O 効率:クエリは必要な列のみを読み取ります。列データは行ストアに比べて 10 倍以上の効率で圧縮されます。ラフインデックス (データブロックごとの MIN/MAX 統計) と組み合わせることで、無関係なデータブロックを大規模にスキップしてから展開できます。PolarDB のコンピューティングとストレージが分離されたアーキテクチャでは、ネットワーク経由で転送されるデータが少ないほど、クエリ応答が速くなります。
CPU 効率:列データは隣接して格納されるため、CPU キャッシュヒット率が向上し、L1/L2 キャッシュミスによるストールが減少します。隣接した列データは SIMD ベクトル化も可能にし、シングルコアのスループットを倍増させます。
主要な用語
| 用語 | 定義 |
|---|---|
| IMCI | インメモリ列指向インデックス。PolarDB におけるハイブリッド行列表ストアの実装です。 |
| 列指向インデックス | InnoDB のセカンダリインデックスの一種で、行フォーマットの代わりに列フォーマットで列データを格納します。 |
| 行グループ | 列指向インデックスにおけるデータ編成の単位。各行グループは 64,000 行を保持します。 |
| データパック | 1つの行グループ内の単一列のデータで、隣接して格納され、圧縮されています。 |
| ラフインデックス | 各データパックに対して事前に計算された統計情報 (MIN、MAX、SUM、NULL カウント、行数) で、無関係なデータパックを展開せずにスキップするために使用されます。 |
| インメモリ列ストア領域 | アクティブなデータパックがクエリ実行のためにキャッシュされるメモリ領域。列データはディスク上で圧縮され、ここにキャッシュされます。 |
| 並列度 (DOP) | クエリの実行に使用される並列スレッドの数。Auto DOP は、システムリソースに基づいてこれを自動的に選択します。 |
| Volcano モデル | 各演算子が Next() インターフェイスを公開し、子演算子から一度に1行 (またはバッチ) ずつデータをプルするクエリ実行モデルです。 |
| ベクトル化実行 | Volcano モデルの変種で、各 Next() 呼び出しが単一行ではなく行のバッチを返し、SIMD アクセラレーションを可能にします。 |
IMCI の仕組み
IMCI は、4つの技術革新を組み合わせています。
InnoDB の列指向インデックス:DDL ステートメントを使用して、選択した列に列指向インデックスを作成します。列指向インデックスは、行ストアよりも大幅に小さい列圧縮ストレージを使用し、デフォルトでインメモリ列ストア領域に配置されます。メモリが不足すると、共有ストレージにスピルします。
列指向実行エンジン:PolarDB のエグゼキュータは、4,096 行のバッチでデータにアクセスし、SIMD 命令を適用して単一の CPU 操作で複数の値を処理します。すべての主要な演算子 (Scan、Hash Join、Nested Loop Join、Group By) は並列実行をサポートしています。MySQL の行エグゼキュータと比較して、列エグゼキュータは分析ワークロードで数桁高いパフォーマンスを発揮します。
ハイブリッド行列表ストアオプティマイザー:クエリが送信されると、オプティマイザーは行ストアのシリアル実行、行ストアのパラレルクエリ、IMCI の 3つの実行パスのコストを評価し、最もコストの低いプランを選択します。ホワイトリストメカニズムにより、サポートされていない列タイプや演算子を使用するクエリは自動的に行ストアにフォールバックし、100% の MySQL 互換性を維持します。
AP/TP ワークロードの分離:専用の読み取り専用 (RO) ノードを、列指向インデックスを持つ分析ノードとして設定します。分析クエリは、利用可能なすべての CPU とメモリを使用して RO ノードで実行され、読み書き (RW) ノードで実行されている OLTP ワークロードには影響を与えません。

技術アーキテクチャ
ハイブリッド行-列オプティマイザー
列指向実行エンジン
IMCI 実行エンジンは、MySQL の行エグゼキュータから独立した、完全に書き直されたものです。その目標は、行ごとの仮想関数のオーバーヘッドと、実行を並列化できないという2つの根本的なボトルネックを解消することです。
ベクトル化並列エグゼキュータ
ベクトル化された式システム
ハイブリッド行列表ストア
OLAP のパフォーマンス
詳細については、「IMCI のパフォーマンス」をご参照ください。











