【TiDB GAME DAY 2024】TiDBにおけるテーブル設計と最適化の事例


サーバーサイド/サーバータスク(PJ横断部署)の 宮脇・牧内です。
2024年3月8日に開催された TiDB GAME DAY 2024 にて「TiDBにおけるテーブル設計と最適化の事例」というタイトルで発表を行いました。
ご参加いただいた皆様、ありがとうございました。

TiDB GAME DAY 2024は PingCAP 社が主催するゲーム業界向けのクローズドなイベントでした。本記事では発表した資料と講演の概要を紹介いたします。

私たちは、より良いユーザー体験を実現し、最高のコンテンツを提供するため、次世代データベースTiDBの導入を積極的に検討してきました。

今回は実際にゲームで利用される機能を元に、どのようにテーブルやクエリを設計すれば TiDB の性能を引き出すことができるのか、検証で得られた知見の一部をご紹介します。検証の内容としては、ゲームで良くある機能を模したテーブルやクエリを使用してベンチマークを行い、少しずつ変更を加えていくことで性能の変化を見るというものです。

この検証では「ガチャ」や「プレゼントボックス」、「フレンド申請」「ランキング」「レイドバトル」などの機能を対象としました。
また、検証を通して得られた結果を元に、「TiDB におけるテーブル設計のガイドライン」を作成し、開発プロジェクトへの共有なども行っています。
なお、TiDBのアーキテクチャはこちらの記事にまとめております。
本記事と併せてご覧ください。

プレゼントボックスのテーブル設計

以下のグラフは「プレゼントボックス」機能を模したテーブル・クエリでベンチマークを実行した際のスループットです。

グラフ中の各項目の詳細は発表資料のスライドをご確認ください。
なお、 Aurora のベンチマーク結果も比較対象として載せていますが、 Aurora と TiDB はスペックや台数、コストを揃えているわけではありません。
TiDB のインスタンス料金が Aurora のものよりも高いので、 TiDB でもこのくらいのパフォーマンスは出てほしい、という参考程度のものです。
このグラフから、 MySQL で使用していたテーブルをそのまま TiDB に持ってきた場合、思うように性能は出ていません。
それに対し、テーブルの設計を変更することで、スループットに何倍もの差が出ることが分かります。

ポイントは以下の3点です。

  • 主キーはランダムになるようにし、書き込みを分散させること
  • 不要なインデックスは極力減らすこと
  • 余分な行の読み込みを減らせるような主キー、インデックスを使用すること

実際のところ、この変更を Aurora に持っていくと、 TiDB と同様に性能が向上することが確認できました。
MySQL はそれ自身の性能からあまりシビアに最適化をしなくても十分なパフォーマンスが出るのに対し、 TiDB では最適化の有無の差が顕著に現れると言えるかもしれません。
つまり TiDB でもきちんと設計さえすれば十分な性能を出せると言えます。

ランキングのテーブル設計

続いて、主キーの設計次第で性能が変化する事例です。
ランキングテーブルを参照する場合、主に以下の2つの目的があるかと思います。

  • ランキング表示のため、特定の範囲のデータをまとめて取得
  • プレイ中のユーザーのランク表示のためデータを1行取得

この場合、ユーザー ID を主キーとするか、ランクを主キーとするかで2種類のテーブル定義が考えられます。
それぞれのテーブルにおいて、ランクによる範囲取得とユーザー ID による取得の結果を比較したグラフを以下に示します。

当然ではありますが、主キーによって参照する方がインデックス経由で参照するよりもクエリのスループットは良くなっています。 TiDB においては、重視するものによって主キーの決め方を決めるようなことも重要になってくるのではないかと考えています。

負荷試験で発生した事例

次に、開発中のプロジェクトで負荷試験を実施したときに確認された事例です。

負荷試験中、 UPDATE クエリや COMMIT クエリで1.5sec前後のスロークエリが記録される現象が発生しました。
本現象の原因は TiKV のリソース不足であり、 TiKV クラスタにおいてリソースを十分に確保するという検証当初から打ち出していた方針を再確認できました。
なお負荷試験を通じて、本事例以外の問題は発生しませんでした。

おわりに

今回の発表の中で行ったテーブルの設計などはデータベースとしては基本的なものかもしれません。
逆に言えば、基本的なことをしっかりとやれば TiDB は十分に運用に使えるものであると確信しました。
今はまだ TiDB は流行り始めたところであり、 MySQL 互換であることなど機能面がよくフォーカスされていますが、今後こういった具体的な設計の話が出てくることを楽しみにしています。
そして我々 Cygames はユーザーの皆様に快適なゲーム環境を提供できるように、今後も TiDB を始め新しい技術にも精力的に取り組んでいきます。

サーバータスクチームは新しい技術の検証や負荷試験などを通して、ゲームの開発・運用をサポートするメンバーを募集しています。
ご興味をお持ちいただけましたらこちらの採用ページをご覧ください。