
Blog Translation
著者: Huansheng Chen (Testing Engineer at PingCAP)
編集者: Calvin Weng, Tom Dewan
想像してみてください。あなたは販売業務に従事しています。販売促進を行った後、上司から販売統計の提出を促されます。顧客関係管理(CRM)プラットフォームに入り、クエリ条件を設定し、クエリを実行します。結果が出ずに60秒間カーソルが点滅しています。上司が見ています。緊張と恥ずかしさを和らげるために、あなたはクエリ条件を変更することを選択しました。さらに1分が経過し、みんなが怒る前にようやく結果が出ます。
IMySQLを利用したSaaS (Software as a Service) プラットフォームをお持ちの方なら、このような状況に陥ったことがあるのではないでしょうか。ビジネスが成長し、データセットが大きくなり、クエリワークロードがますます複雑になると、シャーディングによるMySQLデータベースのスケールアウトがパフォーマンスのボトルネックとなります。その結果、非効率的なクエリ処理が発生し、ユーザーエクスペリエンスが損なわれてしまうのです。このような状況に対し、業界では解決策が求められています。
HTAP (Hybrid Transactional and Analytical Processing) 機能を持つオープンソースの分散型SQLデータベースであるTiDBは、このような状況においてMySQLの代わりになる素晴らしいものです。この記事では、代表的なローコードSaaSプラットフォームであるCorteza CRM上でTiDBとMySQLのパフォーマンスを比較します。また、TiDBがHTAP機能を活用して、コードを変更することなくSaaSプラットフォームを強化することで、新しいアプリケーションの開発をスピードアップする方法も紹介します。
先に結論を:TiDBとMySQLの比較
分析に入る前に、早速ビフォーアフターを比較してみましょう。約500万件の見込み客を収めた16GBのデータセットを使用しました。ご覧の通り、同じハードウェアとデータセットで、実行時間はそれぞれ6秒と31秒と、TiDBはMySQLの5倍ものパフォーマンスを発揮しています。

Corteza CRMとTiDBとの連携
今回の実験では、Corteza上に構築された柔軟性・拡張性に優れたCRMプラットフォームであるCorteza CRM Suiteを使用しました。Corteza CRM Suiteのデータモデルは次のとおりです。
- compose_recordテーブルには、record_idとmodule_id間の関連を記録します。
- compose_record_valueテーブルにはrecord_idと各カラムとその値との関連を記録します。

Corteza CRMのデータモデル
オープンソースの分散型SQLデータベースであるTiDBは、行と列両方のストレージエンジンを統合し、データへのアクセスに最適な方法を決定します。TiKVはオンライントランザクション処理(OLTP)向けに設計されたもので、TiFlashはオンライン分析処理(OLAP)ワークロード向けの列指向のストレージです。

TiDBアーキテクチャ
MySQLからTiDBへの移行
データベースを入れ替える際の最初のステップは、新しいデータベースへデータを移行することです。TiDBはMySQLと互換性があるため、Corteza CRMシステムをTiDBに接続する際に、コードを変更する必要はありません。今回はTiDBのデータインポートツール「mydumper」を使って、MySQLからTiDBにデータを移行しました。MySQLからTiDBにデータをコピーすると、Cortezaはシームレスに動作するようになりました。
なぜMySQLは遅いのか?
Cortezaでは、詳細な業務データがkey-value形式でcompose_record_valueテーブルに格納されているため、一般的なアプリケーションSQLパターンはcompose_record_valueテーブルに複数のJOINが集中しがちです。下記のサンプルSQL文からもわかるように、分析クエリには集中的なフィルタリング、JOIN、集計が含まれています。データモデルに基づき、アプリケーションクエリではcompose_recordからcompose_record_valueへのJOINが6回あります。compose_record_valueテーブルには6回アクセスがあり、そのたびに”.name”列でフィルターがかけられます。compose_recordテーブルとcompose_record_valueテーブルのデータセットが大きくなると、compose_record_valueのインデックス検索の回数が増えるため、クエリーの性能が低下することになります。
SELECT
…
FROM
compose_record AS crd
LEFT JOIN compose_record_value AS rv_BudgetedCost ON (
rv_BudgetedCost.record_id = crd.id
AND rv_BudgetedCost.name = 'BudgetedCost'
AND rv_BudgetedCost.deleted_at IS NULL
)
LEFT JOIN compose_record_value AS rv_ActualCost ON (
rv_ActualCost.record_id = crd.id
AND rv_ActualCost.name = 'ActualCost'
AND rv_ActualCost.deleted_at IS NULL
)
LEFT JOIN compose_record_value …
WHERE
…
GROUP BY
dimension_0
ORDER BY
dimension_0
TiDBのHTAPによるチューニング
従来のインデックス戦略やネステッドループ結合では、Corteza CRMの実行計画パターンに対応しきれないのです。そこで、TiDBのHTAPの機能をご紹介します。TiFlashは、OLAPワークロードのカラムナストレージとして機能するほか、クエリを実行するためのMPP (Massively Parallel Processing) モードもサポートしています。MPPでは、計算の中にノード間のデータ交換(データシャッフル処理)を導入しています。TiDBは、オプティマイザのコスト推定値を用いて、MPPモードを選択するかどうかを自動的に判断することができます。また、今回のような複雑なクエリでは、パーティションプルニング最適化を活用することで、アクセスする必要のあるデータ量を削減し、クエリの実行時間を大幅に改善することも可能となります。
TiDB上のCorteza CRMの性能を以下のように最適化しました。
- 並列ハッシュ結合や最新のカラムナーデータスキャンなど、HTAPによるTiFlash MPPエンジンの利点を活用することが可能
- compose_recordテーブルを”created_at”カラムでレンジパーティション化
- compose_record_valueテーブルを”name”カラムでリスト分割
HTAP機能を有効にすることで…
- オプティマイザは、高速なカラムナデータスキャン、ハッシュ結合、ウィンドウ関数処理など、すべての実行処理をTiFlashにプッシュダウンすることが可能になりました。
- スキーマをレンジとリストパーティションで最適化することで、スキャン方式をTableFullScanからPartitionTableScanに変更しました。これにより、アプリケーションがcompose_record_valueテーブルにアクセスする際に、より効率的になっています。
HTAPでチューニングした結果、上記の例のクエリのレイテンシは730.8msから88.2msに短縮されました。性能は8倍速です!

SQLチューニング結果 (低いほど良い)
さらなるパフォーマンスの向上
今回のテストでは、わずかなチューニングで、Corteza CRMのパフォーマンスを30秒から6秒に向上させました。これだけでも十分な成果ですが、私たちはさらに上を目指せると考えています。データベーススキーマのビジネスロジックを改善できれば、TiDBのHTAP機能を有効に活用できるでしょう。そのような設計には、次のようなものが考えられます。
- 小さめのテーブルに対して、フィルタリングの効いたカラムにインデックスを作成します。これにより、TiDBオプティマイザは、1つのクエリでインデックススキャンとカラムスキャンを同時に活用できる、より優れた「ハイブリッド」プランを選択することができます。
- スキーマのパーティショニングを改善することで、より多くのクエリがパーティション・プルーニングのメリットを受けられるようになりました。結果として、データ処理量の軽減とレイテンシの短縮を実現します。
パフォーマンスの高さに加え、TiDBのHTAP機能は、データの”鮮度”を保証します。アプリケーションは、他のコンポーネントを導入することなく、行と列両方のストレージから新しく作成されたデータにアクセスすることができます。これにより、SaaSプラットフォームのアーキテクチャが大幅に簡略化され、商品化までの時間やメンテナンスコストが削減されます。
まとめ
従来のMySQLデータベースに支えられたSaaSプラットフォームは、巨大なデータセットと複雑なクエリによってもたらされるパフォーマンスのボトルネックにますます直面しています。従来のデータベースソリューションと比較して、TiDBは、急成長する複雑なビジネスワークロードに対応する強固なワンストップソリューションを提供します。TiDBのMySQL互換性とリアルタイムHTAP機能を活用することにより、CortezaのようなCRMプラットフォームは、コードを変更することなく、簡単にパフォーマンスのボトルネックに対処することができるのです。
TiDBを体験するには、コミュニティエディションまたはTiDB Cloud無料トライアルをお試しください。日本語ドキュメントのTiDBクイックスタートガイド、またはTiDB Cloudワークショップガイドのご利用をお勧めします。ご不明な点などございましたら、お問い合わせフォームよりご連絡ください。 また、GitHubにて問題を報告することもできます。
HTAPとTiDBの詳細はこちら
Want to explore TiDB without installing any software? Go to TiDB Playground
TiDB Cloud Dedicated
TiDB Cloudのエンタープライズ版。
専用VPC上に構築された専有DBaaSでAWSとGoogle Cloudで利用可能。
TiDB Cloud Serverless
TiDB Cloudのライト版。
TiDBの機能をフルマネージド環境で使用でき無料かつお客様の裁量で利用開始。