
※このブログは2025年3月7日に公開された英語ブログ「Accelerating Query Performance: The Benefits of TiDB’s In-Memory Engine (IME)」の拙訳です。
データベースでクエリの速度低下や高いリソース消費に悩んだことがあるなら、それはあなただけではありません。Multi-Version Concurrency Control (MVCC) 上に構築されたデータベースの多くは、時間の経過とともにクエリのパフォーマンスが低下するという問題に直面します。MVCCは同時アクセスを管理するために不可欠ですが、過度な履歴バージョンのスキャンはクエリを遅くし、システムリソースに過負荷をかける可能性があります。これはMVCC増幅として知られる問題です。
eコマースプラットフォームが大規模なセールイベントを実施している状況を考えてみましょう。顧客は注文を頻繁に変更し、リアルタイムで購入したり、更新したり、キャンセルしたりします。これらの更新が積み重なると、システムは過度に履歴バージョンをスキャンする必要があるため、現在の注文ステータスを取得するクエリが遅くなります。これにより、注文確認の遅延が発生し、顧客の不満や売上損失につながる可能性があります。
この問題を解決するために、TiDBにIn-Memory Engine (IME) を構築しました。IMEは、頻繁にアクセスされる履歴バージョンをインテリジェントにメモリにキャッシュすることで、クエリの遅延とCPU使用率を大幅に削減します。私たちのテストでは、IMEはSELECTの99パーセンタイル応答時間を400ミリ秒からわずか10ミリ秒に短縮し、同時にCPU消費量を25%削減しました。この改善は、読み取りが多いなワークロードにおいて特に価値があります。これにより、システムは多くの同時実行されるクエリをより効率的に処理できます。
このブログでは、TiDBのIn-Memory Engine (IME) について詳しく解説し、クエリパフォーマンスを高速化する方法や、使い方について解説します。
なぜMVCC増幅はクエリーパフォーマンスを損なうのか?
データベースは、同時トランザクションを効率的に処理するためにMVCCを使用します。しかし、時間が経つにつれて、過度に履歴バージョンが蓄積すると、クエリ速度が低下します。問題となるのは次のような場合です。
- 頻繁な更新と削除:eコマースの注文処理では、注文へのあらゆる更新 (変更、キャンセル、ステータス変更) のたびに、新しいバージョンのデータが生成されます。注文の最新状況を照会するクエリは、迅速に処理されるべきです。しかし、最適化が施されていないと、古いバージョンのデータまでスキャンしてしまう可能性があり、レスポンス時間がかかってしまいます。
- 長期のデータ保存期間:金融不正検出では、取引履歴を分析のために保持する必要があります。その期間は数時間、あるいは数日になることもあります。銀行がリアルタイムで不正の兆候を調べる場合、数千件もの古い取引記録を検索するよりも、直近の取引の検索に重点を置く必要があります。不正検出の遅れは、脅威の見逃しにつながり、金融の安全性を損なうことになります。
例として、SELECTクエリはデータセットの直近2つのバージョンだけを必要とする場合でも、不要な古いバージョンを20個もスキャンしてしまうことで、処理速度が10倍も遅くなることがあります。
インメモリエンジンによるTiDBのクエリパフォーマンスの高速化
IMEは、最新のデータバージョンをインテリジェントにメモリにキャッシュすることで、MVCC増幅に対処するために専用に構築されています。従来のストレージベースのアプローチとは異なり、IMEはTiDBクエリを2つの方法で最適化します。
1. 最新かつ最も重要なデータを優先順位付け
IMEは、データをすべて区別なくキャッシュするのではなく、アクセス頻度が高く、最近更新されたデータに絞ってキャッシュします。これにより、クエリは不必要なスキャンを避け、最新のレコードを取得できます。
例として、数千人のプレイヤーが同時にランキングを更新するゲームのランキングボードを考えてみましょう。IMEがなければ、ランキングのクエリは古いプレイヤーの統計データを検索しなければならず、ランキングボードの更新が遅れてしまいます。IMEは、最も関連性の高いプレイヤーの記録のみをキャッシュすることで、ランキングボードを瞬時に更新できるようにします。
2. メモリを活用したスピードアップ
メモリからのデータ取得は、ストレージから取得するよりも高速です。IMEは、頻繁にアクセスされるデータをメモリに保持することで、クエリ実行速度を向上させ、アクセス頻度の高いクエリに対して迅速に結果を返します。
これは、ストリーミング配信サービスにおけるリアルタイムのコンテンツ推薦機能で非常に重要になります。ユーザーが楽曲をスキップしたり、予告編を視聴したりした場合、推薦エンジンは即座に更新する必要があります。IMEがない場合、システムが古いユーザーの好みを処理するため、推薦が遅延する可能性があります。IMEは、ユーザーのデータが最新であることで、利用者のエンゲージメントと定着率を高めます。
IMEによる実世界でのクエリーパフォーマンスの向上
読み取りが多く、更新も頻繁な環境でIMEのテストを徹底的に行い、その効果を測定しました。結果として、大きな改善が得られました。
- CPU使用率を25%削減:IMEは、TiKVノードあたりのCPU消費量を約2コア分削減 (8コア、32GBの環境) し、システムをより効率的に実行できるようにしました。
- p99クエリのレイテンシを40倍短縮:速度の遅いクエリで、レイテンシが400ミリ秒からわずか10ミリ秒に減少し、応答性が大幅に向上しました。
- クエリ効率の向上:以前は数万の履歴バージョンをスキャンしていたクエリが、数百の履歴バージョンのみのスキャンに最適化され、不要な計算処理を削減しました。
以下のパフォーマンス指標は、IMEが実際の環境でクエリ実行をどのように最適化するかを示しています。以下のグラフは、IME有効化前後の主要なシステムパフォーマンス指標を比較したものです。
- CPU効率:IMEを有効にするとCPU使用率がより安定し、不要なスパイクやオーバーヘッドが減少します。
- メモリ最適化:IMEは、頻繁にアクセスされるデータを動的にキャッシュすることで、メモリを過剰に消費することなくスキャン効率を向上させます。
- クエリ遅延の改善:99パーセンタイル値 (p99) のgRPCメッセージ処理時間は大幅に短縮され、IMEが読み取り負荷の高いワークロードの応答時間を短縮する効果を示しています。
- スループット向上:IMEは、書き込み処理や読み取り処理など、データベースの主要な処理効率を高め、システム全体のパフォーマンスを向上させます。

IMEを有効にすると、TiKVのCPU使用率が低くなり、コプロセッサへのクエリのリクエスト遅延が大幅に改善されます。
クエリのレスポンスタイム、リソースの利用率、および運用効率の改善により、IMEはパフォーマンスが重要なTiDB導入に不可欠な機能であることが証明されました。
インメモリエンジンを有効にする方法
IMEを使い始めるのは簡単です。
- TiDB 8.5にアップグレードする – IMEを利用するためには、クラスタが最新バージョンで動作していることを確認してください。
- TiKVでIMEを有効にする – TiKVの設定ファイルを更新してください。
[in-memory-engine]
enable = true
- パフォーマンス向上を監視する – 既存のクエリワークロードを実行し、レイテンシとCPU使用率の向上を観察してください。
リアルタイムで数千の顧客ダッシュボードを管理するSaaSプラットフォームにとって、IMEはより高速な分析レンダリングとシームレスなユーザーエクスペリエンスを保証します。
TiDBインメモリエンジンによるクエリパフォーマンスの最適化
TiDBクエリのパフォーマンスを最適化する簡単で効果的な方法をお探しの場合、IMEが役立ちます。詳細については、公式ドキュメントを参照するか、最新のTiDBをダウンロードしてください。
TiDBのIMEについてご質問がある場合は、Twitter、LinkedIn、またはSlackチャンネルでお問い合わせください。
TiDB Cloud Dedicated
TiDB Cloudのエンタープライズ版。
専用VPC上に構築された専有DBaaSでAWSとGoogle Cloudで利用可能。
TiDB Cloud Serverless
TiDB Cloudのライト版。
TiDBの機能をフルマネージド環境で使用でき無料かつお客様の裁量で利用開始。