Upgrade to Pro — share decks privately, control downloads, hide ads and more …

2026年度新卒技術研修 サイバーエージェントのデータベース 活用事例とパフォーマンス調査入門

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

2026年度新卒技術研修 サイバーエージェントのデータベース 活用事例とパフォーマンス調査入門

Avatar for CyberAgent

CyberAgent PRO

April 10, 2026

More Decks by CyberAgent

Other Decks in Technology

Transcript

  1. 鬼海 雄太 Yuta Kikai •メディア統括本部サービスリライアビリティグループ (メディア事業 横断SRE組織) 2012年 サイバーエージェント中途入社  コミュニティサービスやソーシャルゲームの  インフラやデータベースを担当

     現在は横断SRE組織である現チームで  AmebaのDBREとして従事  チームブログであるSRGポータルに毎月記事執筆中  https://ca-srg.dev 2025年~ AWS Community Builders (Category: Data)
  2. 基本用語 トランザクション データベースに対する複数の処理をひとまとまりとして扱い、 すべて成功の時だけ確定し、途中で失敗した場合は元に戻す仕組み データの整合性を保つための重要な役割 口座送金の例: トランザクション開始 A口座残高 100,000円 B口座残高

    300,000円 成功 失敗 ロールバック 開始前の状態に戻す A口座残高 100,000円 B口座残高 300,000円 A口座 -50,000円 B口座 +50,000円 成功 A口座残高 50,000円 B口座残高 350,000円 失敗 A口座から引き落とし B口座へ入金 コミット(結果確定)
  3. 基本用語 スケールアップ・スケールアウト サーバー1台の性能を変えるか、サーバー台数を変えるか スケールアップ / ダウン 1台のサーバーの性能を変更する 構成によっては再起動や一時的なシステム停止が必要になることがある スケールアウト サーバーの台数を変更する

    サーバー CPU: 2core Mem: 4GB CPU:4core / Mem: 8GB CPU:8core / Mem: 16GB スケールアウト / イン サーバー1 サーバー2 サーバー3 データベースは読み取り処理は分散しやすい 書き込み処理の分散はデータベースの製品や構成によって難しさが異なる
  4. リレーショナルデータベース •表(テーブル)を利用してデータを格納 テーブルは行( row )と列( column )で構成 • テーブル同士が 関係・関連(

    リレーション )をもつ • SQL( Structured Query Language )というデータ操作言語でデータを管理 • データの一貫性、整合性を担保するために厳格な制約 • 代表的なリレーショナルデータベース管理システム( RDBMS ) Oracle Database, MySQL , SQL Server , PostgreSQL
  5. データの書き込み性能の拡張方法 •テーブルの水平分割 •テーブルの垂直分割 id ユーザー名 職業 レベル 1 鈴木 A子

    戦士 10 2 佐藤 B太 僧侶 3 3 山田 C助 勇者 7 4 高橋 D次 戦士 22 id ユーザー名 職業 レベル 1 鈴木 A子 戦士 10 3 山田 C助 勇者 7 id ユーザー名 職業 レベル 2 佐藤 B太 僧侶 3 4 高橋 D次 戦士 22 id ユーザー名 職業 レベル 1 鈴木 A子 戦士 10 2 佐藤 B太 僧侶 3 3 山田 C助 勇者 7 4 高橋 D次 戦士 22 id ユーザー名 職業 1 鈴木 A子 戦士 2 佐藤 B太 僧侶 3 山田 C助 勇者 4 高橋 D次 戦士 lv_id uid レベル 1 1 10 2 2 3 3 3 7 4 4 22 同じテーブルをid単位で分割 テーブル単位で分割 頻繁に書き換わりそうなデータを分離
  6. NoSQLのデータモデルによる分類の一例 分類 特徴と強み 弱み 製品の一例 キーバリュー型 - key:value単位でデータを格納 - シンプルで高速

    - 同時アクセス性能が高い - データの関係性の表現が難しい - トランザクションがないのでデータの信頼 性が低い - Redis ( Valkey含む ) - Memcached - Amazon DynamoDB(※) 列指向型 - 高い書き込み性能 - 大量データを効率的に扱える - ビッグデータの分析 - 複雑なクエリが困難 - ランダムアクセスには向いていない - トランザクションサポートが限定的 - Apache Cassandra - HBase - Google Cloud Bigtable グラフ型 - 関係性の検索(ユーザー同士 の繋がりや地図の経路情報な ど)に強い - 他と比べるとデータ更新が高コスト - Neo4j - Amazon Neptune ドキュメント型 - データ型や定義を決めずに JSONなどの構造をもったドキュ メントデータを格納 - データの関係性の表現が難しい - トランザクションサポートが限定的 - MongoDB - Google Cloud Firestore - ElasticSearch ( OpenSearch含む ) - Amazon DynamoDB(※)
  7. データの書き込み性能拡張問題の解決の例 (MongoDBの場合) •自動シャーディングによる水平スケーリング range 0 - 3 range 4 -

    7 range 8 - アプリケーションは書き込み先を意識せず、 自動でルールに則って分散される
  8. NewSQLの登場 •RDBMSとNoSQLの良いところ取りをした設計 RDBMSのデータの整合性( トランザクション機能 ) NoSQLのスケーラビリティ( 分散アーキテクチャ ) • 代表的な製品

    TiDB , CockroachDB , YugabyteDB , Cloud Spanner , Aurora DSQL • NewSQLの弱み 小規模なデータセットや単純なクエリではRDBMSやNoSQLにパフォーマンスで劣る可能性 複雑なアーキテクチャ
  9. 社内でのデータベース採用割合 TOP10 1. MySQL 33.3% 2. Memcached,Redis 33.3 % 3.

    ElasticSearch 9.1% 4. Amazon DynamoDB 7.8% 5. Mongo DB 4.2% 6. Google Cloud Spanner 3.2% 7. Google Cloud Firestore 2.9% 8. PostgreSQL 2.3% 9. Google Cloud Bigtable 1.9% 10. TiDB 1%
  10. 社内でのデータベース採用割合 TOP10 1. MySQL 33.3% 2. Memcached,Redis 33.3 % 3.

    ElasticSearch 9.1% 4. Amazon DynamoDB 7.8% 5. Mongo DB 4.2% 6. Google Cloud Spanner 3.2% 7. Google Cloud Firestore 2.9% 8. PostgreSQL 2.3% 9. Google Cloud Bigtable 1.9% 10. TiDB 1%
  11. 社内でのデータベース採用割合 TOP10 1. MySQL 33.3% 2. Memcached,Redis 33.3 % 3.

    ElasticSearch 9.1% 4. Amazon DynamoDB 7.8% 5. Mongo DB 4.2% 6. Google Cloud Spanner 3.2% 7. Google Cloud Firestore 2.9% 8. PostgreSQL 2.3% 9. Google Cloud Bigtable 1.9% 10. TiDB 1% 2023年の集計から3年経過... 近年は以下3つのDBの採用事例が 社内で少しずつ増えている印象 • Google Cloud Spanner • PostgreSQL • TiDB
  12. レプリケーションでよく利用されるパターン MySQLバージョンアップ 参照性能スケールアウト 調査クエリ用MySQL MySQL 5.7 MySQL 8.0 MySQL 5.7

    リーダーエンドポイント アプリケーション 参照クエリ アプリケーション 参照クエリ ※サポート対象外
  13. NoSQL分類表から社内で採用されているもの再確認 分類 特徴と強み 弱み 製品の一例 キーバリュー型 - key:value単位でデータを格納 - シンプルで高速

    - 同時アクセス性能が高い - データの関係性の表現が難しい - トランザクションがないのでデータの信頼 性が低い - Redis ( Valkey含む ) - Memcached - Amazon DynamoDB(※) 列指向型 - 高い書き込み性能 - 大量データを効率的に扱える - ビッグデータの分析 - 複雑なクエリが困難 - ランダムアクセスには向いていない - トランザクションサポートが限定的 - Apache Cassandra - Hbase - Google Cloud Bigtable グラフ型 - 関係性の検索(ユーザー同士 の繋がりや地図の経路情報な ど)に強い - 他と比べるとデータ更新が高コスト - Neo4j - Amazon Neptune ドキュメント型 - データ型や定義を決めずに JSONなどの構造をもったドキュ メントデータを格納 - データの関係性の表現が難しい - トランザクションサポートが限定的 - MongoDB - Google Cloud Firestore - ElasticSearch ( OpenSearch含む ) - Amazon DynamoDB(※)
  14. Redis 特徴 • 高パフォーマンスなインメモリKVS( Key-Value-Store ) • 多様なデータ型が存在 String ,

    List , Set , Hash , Sorted Set • データの永続化も可能 • レプリケーションやRedis Clusterを用いたスケーラビリティと高可用性 主なユースケース • キャッシュ、セッションデータ、キュー、メッセージング、リアルタイムランキング
  15. 特徴 • ドキュメント指向データベース • JSON形式のデータを格納できる • 事前にフィールド名やデータ型を定義しなくてもよい • シャーディングによる水平分割 •

    レプリカセットによる高可用性 主なユースケース • 大量データの書き込み、スキーマが頻繁に変更されるアプリケーション MongoDB
  16. 特徴 • MySQL互換の分散型SQLデータベース • トランザクション機能あり • 分散アーキテクチャによる高いスケーラビリティと可用性 • OLAP(オンライン分析処理)にも対応(HTAP) •

    セルフホスティングも可能 主なユースケース • 分析処理併用、大規模MySQLの置換 TiDB TiDB Docs | https://docs.pingcap.com/ja/tidb/stable/tidb-architecture/ より引用 ※2025年に発表されたTiDB CloudのTiDB Xのアーキテクチャとは異なります
  17. 特徴 • Googleが提供する高性能なデータベース • SQL対応 ◦ GoogleSQL ◦ PostgreSQL互換 •

    高いスケーラビリティと高可用性 • トランザクション機能あり • OLAP対応( Spanner Data Boost ) 主なユースケース • データ量の多いシステム、分析処理併用 Google Cloud Spanner Google Cloud Docs | https://cloud.google.com/spanner/docs/databoost/databoost-overview より引用
  18. データベース活用事例の紹介1 会社名 : 株式会社サイバーエージェント サービス名 : Amebaブログ データベース 用途・入れているデータの一例 Amazon

    Aurora MySQL - ユーザー情報 - ブログ記事データ - 下記以外のデータすべて Amazon ElasticCache ( Redis ) - ブログ記事情報のキャッシュ - いいね機能のキャッシュ Amazon ElastiCache ( Memcache ) - ユーザープロフィールのキャッシュ - ブログ設定情報のキャッシュ Amazon OpenSearch Service ( 旧名 Elasticsearch Service ) - 広告商品検索用データ Amazon DynamoDB - アクセス解析機能のデータ
  19. データベース活用事例の紹介2 データベース 用途・入れているデータの一例 MongoDB - マスターデータ - ユーザーデータ - 下記以外のデータすべて

    Redis - ランキングデータ - 一時的な購入情報、エリア情報など永続化不要なデー タ 会社名 : 株式会社サイバーエージェント サービス名 : ピグパーティ
  20. データベース活用事例の紹介3 データベース 用途・入れているデータの一例 Google Cloud Spanner - ユーザーデータ - ユニオン(ギルド)データ

    - 下記以外のデータすべて Google CloudSQL ( MySQL ) - マスターデータ - 運営用の管理データ Google Cloud Memorystore - ランキングデータ - その他一時キャッシュ 会社名 : 株式会社QualiArts サービス名 : IDOLY PRIDE
  21. データベース活用事例の紹介4 データベース 用途・入れているデータの一例 Google Cloud Spanner (Tokyo-Osakaマルチリージョン ) - サービスに関わるすべてのデータ

    OpenSearch Service - Agentic Searchで利用する社内ドキュメントの 全文検索用途 S3 Vectors ※データベースではないが、ベクトルストアとして利用 - Agentic Searchで利用する社内ドキュメントの ベクトルデータを格納 会社名 : 株式会社WinTicket サービス名 : WINTICKET 可用性とパフォーマンスを追求するWINTICKETサーバーのインフラリアーキテクチャ 色んなデータソースに対応した RAG システム「RAGent」の紹介
  22. データベース活用事例の紹介6 会社名 : 株式会社タップル サービス名: tapple CyberAgent Developers Blog |

    75億ドキュメント以上のデータを保持するMongoDBを、Amazon EC2からMongoDB Atlasへ約3ヶ月で移設した方法 CyberAgent Developers Blog | タップルにおける約4年越しのキャッシュストア大幅アップデートの軌跡 データベース 用途・入れているデータの一例 MongoDB - ユーザーデータ - マスターデータ - 下記以外のデータすべて Amazon ElasticCache ( Redis ) - MongoDBの前段キャッシュ - 排他制御ロックデータ Amazon OpenSearch Service - 恋愛対象の候補検索用データ Amazon DynamoDB - メイン機能ではないシステムデータ等
  23. データベース活用事例の紹介7 会社名 : AWA株式会社 サービス名: AWA データベース 用途・入れているデータの一例 DocumentDB(MongoDB) -

    アーティスト情報、プレイリスト、ログイン情報 - 下記以外のデータすべて Amazon ElasticCache For Redis - キャッシュ全般 Amazon OpenSearch Service - 検索機能 MemoryDB for Redis - ラウンジ機能関連、お知らせ情報 AWS Blog | AWA 株式会社、MongoDB on EC2 から Amazon DocumentDB への移行でデータベースコストを約 50% 削減(Part 1/2) AWS Blog | AWA 株式会社、MongoDB on EC2 から Amazon DocumentDB への移行でデータベースコストを約 50% 削減(Part 2/2)
  24. データベース活用事例の紹介8 会社名 : 株式会社サイバーエージェント サービス名 : Dynalyst データベース 用途・入れているデータの一例 Aurora

    MySQL ( MySQL併用 ) - 広告主情報 - 予算情報 - ホワイトリスト情報 - その他マスターデータ Amazon ElasticCache ( Redis ) - フリークエンシーキャップ (短期間で同一ユーザーに複数回広告を当てるのを防ぐ機構) - その他キャッシュ Amazon ElastiCache ( Memcache ) - MySQLに載せているデータのキャッシュ Amazon DynamoDB - リターゲティング対象ユーザのデータ - 広告動画視聴履歴の一時保存 - クリック履歴の一時保存 SpeakerDeck | 月間数千億リクエストをさばく技術 CyberAgent Way | ハイブリッドクラウドを駆使したコスト最適化:SREと連携したDynalystの移設 より引⽤(右図)
  25. データベース活用事例の紹介9 会社名 : 株式会社サイバーエージェント サービス名 : 全社展開 AIプラットフォーム Dify データベース

    用途・入れているデータの一例 Amazon Aurora PostgreSQL - アプリデータ - ユーザ情報 - ドキュメントデータなど TiDB (TiDB Cloud Starter ) - ベクトルデータ 3,000時間/月の業務削減を実現する Dify × TiDB Cloud StarterによるAI 基盤の裏側 サイバーエージェント社員の20%が使うAIプラットフォーム「Dify」、プロダクト主導で3,000時間/月削減する方法
  26. データベース選定の理由 MySQL MySQLを利用しているサービス: Amebaブログ AmebaはAmebaブログを中心としたサービス 2004年からスタートし、今年21周年を迎える歴史あるサービス MySQL選定理由 ➢ 運営初期の頃、2006年頃にMySQL4系の時代から利用。( 当時はOracle RACと併用

    ) ➢ Amebaブログは参照ヘビーなサービスで、当時利用できるOSSのデータベースでは参照性能の スケールアウトが比較的容易だったMySQLが選ばれた。 ➢ 何度かシステム刷新を経て、現在はMySQL 8.0(Aurora MySQL)を使用 CyberAgent Developers Blog | アメブロ2016:インフラ編 〜大規模リニューアルの裏側〜 CyberAgent Developer Conference 2022 | 事業と歩むAmebaシステム刷新の道 日経クロステック|100億PVにも耐えられる、アメブロがOracle RACで性能向上
  27. データベース選定の理由 MongoDB MongoDBを利用しているサービス:ピグパーティ 仮想空間内でアバター( ピグ )を使って着せ替えや部屋の模様替えを楽しむアバターSNS MongoDB 選定理由 ➢ サーバサイドにNode.jsを採用していて、JSONをそのまま格納できるMongoDBと相性が良い ➢

    柔軟なスキーマ設計により仕様変更が多いゲーム開発にマッチ ➢ 自動シャーディングによる負荷分散とレプリケーションによる高可用性 ➢ ピグパーティより前に運営開始したピグライフでもMongoDBを採用しており知見があった Slideshare | MongoDB + node.js で作るソーシャルゲーム Speakerdeck | ピグパーティにおけるMongoDB CommunityバージョンからAtlasへの移行事例
  28. データベース選定の理由 Elasticsearch Elasticsearchを利用しているサービス:tapple tappleは2014年にサービス開始したマッチングサービス 共通の趣味を通して異性との交流や出会いのきっかけを提供 Elasticsearch選定理由 ➢ リリース当初はユーザー検索機能もメインDBであるMongoDBを利用してきた ➢ MongoDBは検索に強いわけではないので、ユーザー数の増加により性能が悪化してきた ➢

    ユーザー検索機能を大規模データの検索に強みのあるElasticsearchに切り替えた Speakerdeck | タップル誕生における、事業成長に合わせた継続的なシステム改善について ※サービス名称が変更されたAmazon OpenSearch Service 利用中。名称変更については下記記事を参照 Publickey | 「Amazon Elasticsearch Service」の名称が「Amazon OpenSearch Service」に変更。ElasticsearchからフォークしたOpenSearchも採 用
  29. データベース選定の理由 Cloud Spanner Cloud Spannerを利用しているサービス:IDOLY PRIDE IDOLY PRIDEはアイドルマネジメントRPGのゲーム 2021年リリース ゲーム開発と運営はSGEのQualiArtsが担当 Cloud Spanner選定理由

    ➢ 過去の別ゲームではMySQLやMongoDBを採用してきた ➢ MySQLでは高負荷なゲームの書き込みの分散で苦労していた ➢ MongoDBは当時トランザクションがなかったり、MongoDBクラスタの運用に苦労していた ➢ Cloud Spannerはフルマネージドで、自動水平分割機能やトランザクション機能をもっていた speakerdeck | ゲーム「IDOLY PRIDE」を構成するGCPアーキテクチャの全貌 「IDOLY PRIDE」におけるGoogle Cloud Spannerの活用
  30. データベース選定の理由 TiDB TiDBを利用しているサービス:大規模データ処理基盤 サイバーエージェント内で横断的に利用される大規模データ処理基盤 以前は基盤全体がHadoopエコシステムに依存していて、データストアにHBaseを利用していた TiDB選定理由 ➢ HBaseの利用と運用の面から複数の課題があった ▪ 簡単な集計、検索にもJavaでコードを書く必要がある ▪

    HBaseはプライベートクラウドのVM上で運用していて手間が多かった ➢ TiDBはMySQL互換であるため利用者が使いやすく、複雑なクエリの実行も可能 ➢ TiDB OperatorによってKubernetes上でTiDBを運用可能 speakerdeck |TiUG #1 HBaseからTiDBへの移行を選んだ理由
  31. データベース選定の理由 TiDB Cloud TiDB Cloudを利用しているサービス:全社展開 AIプラットフォーム Dify サイバーエージェント内で横断的に利用されるノーコードAIプラットフォームDify ベクトルデータベースとしてTiDB Cloud Starterプランを採用

    TiDB Cloud選定理由 ➢ 全社展開で利用者もデータ量も急激に増加 ▪ マネージドで動的なスケールが可能でパフォーマンスが安定している ➢ 他のベクトルデータベースと比べて低コストで運用可能 ▪ OpenSearch Serviceをベクトルデータベースとして利用する場合、最小構成で月額数万円 ▪ TiDB Cloud Starterの場合従量課金かつ無料枠も存在する為、月額数百円 ~ 数千円 3,000時間/月の業務削減を実現する Dify × TiDB Cloud StarterによるAI 基盤の裏側
  32. ガールフレンド(仮): ギフトボックスの仕様による性能悪化と データサイズの肥大化 概要 1. サービスリリース当初から「ギフトボックス」という機能があった • ログインボーナスやイベント報酬などのアイテムがここに送られる • ユーザーは任意のタイミングで自身のボックスに受取り可能

    2. ギフトの受取日時の期限の設定がなかった • ユーザー側のボックスがいっぱいでギフトボックスに溜め込むユーザーが多発 3. 溜め込んだユーザーがギフトボックスを開くだけでMySQLの負荷増大 • 1ユーザーで100万件以上溜め込むユーザーもいた 4. 一時対応後、テーブルのデータサイズの肥大化が問題に
  33. 根本対応 1. ギフトボックスの仕様変更によるレコード件数の大幅削減 ギフトボックスの一部アイテムをポイント(数値)に変換する仕様を追加 1アイテム = 1レコードだったので集約できる ユーザーの不利にならないような一定ルールで一括変換 2. 複合インデックスの削除

    レコード件数が減ったことで複合インデックスを削除しても影響が出なくなった レコード件数削減と複合インデックス削除によりテーブルのデータサイズは半減した ガールフレンド(仮): ギフトボックスの仕様による性能悪化と データサイズの肥大化
  34. 【要件】 ギフトボックスのデータサイズ肥大化問題の対応をどうするか 【実現方法のパターン】 ・全アイテムに受取期限を設定し、古いアイテムは一括削除 ・一定ルールのアイテムをすべて数値に変換し、変換した レコードを削除 ・サーバースペック増強で対応 1. 開発チームのエンジニアや開発リーダーと実現方法の協議 開発チーム

    参考:ゲームの仕様を変えるような対応をおこなうための社内フローの一例 「開発の工数はほぼかけずに 対応できますね。」 「その代わり毎月のサーバー 費用がかなり高額になります。」 「今後さらにデータが増えたら 対応できなくなりそう。 この方法は今回無しで」 ✗
  35. 【要件】 ギフトボックスのデータサイズ肥大化問題に対応させる 【実現方法のパターン】 ・全アイテムに受取期限を設定し、古いアイテムは一括削除 ・一定ルールのアイテムをすべて数値に変換し、変換した レコードを削除 ・サーバースペック増強で対応 2. サービスの責任者(プロダクトマネージャー等)も交えて、対応の結論を出す サービス責任者

    開発チーム 「全アイテムに受取期限設定 はユーザーへの不利益が大きい のでやめましょう」 「一定のレアリティ以下の アイテムなら、数値変換しても 不利益にならない設計にできそうです。」 参考:ゲームの仕様を変えるような対応をおこなうための社内フローの一例 ✗ ✗
  36. Google Cloud Spannerでも自動分割が追いつかないケース • Google Cloud Spannerはフルマネージドで自動で水平分割できるNewSQL • 新作スマホゲームはサービス公開時に大量のアクセスが押し寄せる •

    Spannerの自動分割・再配置が追いつかず一部に負荷が集中する可能性がある Google Cloud Blogより: Ready, set, launch! Cloud Spanner makes application launches easier with warmup and benchmarking tool. 4ノードで起動しても初期は負荷が偏る事がある Cloud Spanner Cloud Spanner Cloud Spanner 公開時のアクセス集中で自動分割・再配置が追いつかず 自動分割・再配置が進んだ理想的な状態
  37. Spannerの負荷対策としてウォームアップは効果的 • Spannerはデータをsplitという単位で管理 • 負荷に応じてsplitをさらに分割・再配置していく • 公開前に本番相当の負荷をかけて分割・再配置を進めておく(ウォームアップ) Google Cloud Blogより:

    Ready, set, launch! Cloud Spanner makes application launches easier with warmup and benchmarking tool. 公開前に本番相当の負荷をかける Cloud Spanner Cloud Spanner 自動分割・再配置が進んだ理想的な状態 サービスを公開!
  38. 現在は Pre-splitting 機能で事前に分割を指定できる • SpannerのPre-splittingは2025年4月28日に正式リリースされた機能 • 事前にsplit point(分割点)を手動で追加することで分割しやすい状態を用意できる • 例:

    あるテーブルの主キー(会員ID)にsplit pointを設定する場合 Google Cloud Docs: 事前分割の概要 主キー(会員ID)の先頭2桁を10ずつsplit pointに指定したイメージ Cloud Spanner ノード1 ノード2 ノード3 ノード4 サービス公開! 会員ID: 00xxxxxx 10xxxxxx 20xxxxxx … 90xxxxxx 00-10 11-20 21-30 31-40 41-50 51-60 61-70 71-80 71-80 81-90 91-99 事前に指定したsplit pointに沿ってデータが配置される Cloud Spanner 00-10 11-20 21-30 31-40 41-50 51-60 61-70 71-80 71-80 81-90 91-99
  39. 関連データを近くに配置できる”インターリーブ” • よく一緒に参照される親子テーブルを近くに配置する仕組み • 関係のあるデータをまとめて参照しやすくなりアクセス効率が改善 Google Cloud ドキュメント: Spanner のスキーマ設計の最適化

    通常のデータ配置イメージ Cloud Spanner ノード1 ノード2 ノード3 ノード4 User: A Order: A1 インターリーブしたデータ配置イメージ Cloud Spanner ノード1 ノード2 ノード3 ノード4 User: A └ Order: A1 └Item: A1-1 Order: B1 User: B User: C User: D Order: C1 Item: C1-1 Order: D1 Item D1-1 Item: A1-1 Item: B1-1 User: B └ Order: B1 └Item: B1-1 User: C └ Order: C1 └Item: C1-1 User: D └ Order: D1 └Item: D1-1
  40. Database Insightsの見方 データベース負荷 • 平均アクティブセッション (Average Active Sessions ) •

    データベースのパフォーマンスを評価するための指標 • 1秒ごとにアクティブなセッション情報をサンプリング • アクティブなセッションとは”CPU使用中“ , ”他の処理を待機中”の2つがある
  41. 平均アクティブセッション(AAS)が高い場合 AAS >= RDSインスタンスの最大vCPU数の場合 • vCPUと同じぐらいかやや超えていた場合 → パフォーマンス影響の可能性あり • vCPU数を大きく超えていた場合

    → ほぼ確実にパフォーマンスに問題が起きていた 下記の状況の場合 • 断続的にvCPUのラインを超えてAAS が4になっているのでパフォーマンス影響の可能性あり
  42. EXPLAIN結果のtype項目 type     テーブルへのアクセス方法(access_type)        system 1行しかないsystemテーブル ( constの特殊例 )

    const PRIMARYまたはUNIQUEインデックスを使い一致するレコード数が最大1行の場合(等価検索) eq_ref PRIMARYまたはUNIQUEインデックスを使いJOINしている場合 ref PRIMARYまたはUNIQUEインデックス ではない 等価検索やJOIN fulltext 全文検索インデックスを使っている場合 ref_or_null PRIMARYまたはUNIQUEインデックス ではない 等価検索にOR条件でNULL値の検索した場合 index_merge 複数のインデックスをマージしている場合 unique_subquery サブクエリ内でPRIMARYまたはUNIQUEインデックスを使い等価検索をしている場合 index_subquery サブクエリ内でPRIMARYまたはUNIQUEインデックス ではない 等価検索をしている場合 range インデックスを使用した範囲検索( WHERE <>, >, >=, <, <=や BETWEENやIN )の場合 index インデックスフルスキャン もしくはカバリングインデックスの場合 ALL インデックス不使用のフルテーブルスキャン https://dev.mysql.com/doc/refman/8.0/ja/explain-output.html#explain-join-types 遅い可能性 高速
  43. Google Cloud Spannerでの調査の流れ 1. System insightsでCPU使用率などSpanner全体の状況を俯瞰して確認する 2. Query insightsで重いクエリの上位を確認し、重いクエリを特定し調査する 3.

    Lock insightsでロック競合がおきていなかったか確認する 4. Key Visualizerで問題のある偏ったデータアクセスが発生していなかったか確認する
  44. Aurora MySQL MCPサーバーを使った調査のイメージ • Aurora MySQLに対して自然言語から SQL を作ってクエリを実行できる(※次ページに注意事項有) • Database

    Insights などで遅いクエリを特定したあとの調査を補助 Usersテーブルの◯◯クエリが遅いから調べて Claude Code Usersテーブルの構成とデータ状況を調べます Aurora MySQL MCPサーバー (AIエージェント) Aurora MySQL クラスタ
  45. • 本番環境に接続する場合は読み取り専用にする ◦ 書き込み可能だと、意図しない破壊的な更新クエリが実行される可能性がある ただし、読み取り専用でもシステムに悪影響が出る高負荷なクエリが実行される可能性はある (本番環境と同じデータをもつ隔離環境で使えれば理想的) • ベンダーなど公式から提供されているMCPサーバーの利用を推奨 ◦ 個人作成などの非公式なMCPサーバーは、安全性を自身で確認する

    • AIからのアドバイスを鵜呑みにしない ◦ 対応の最終判断は人間が行うこと。判断できる技術力を身につけましょう (AIエージェント) データベース系MCPサーバーの注意点 クエリ実行が遅いのはデータ件数が多いせいなので全件消します (AIエージェント) 調査のために全スキーマの全テーブルをSELECTします
  46. 4章のまとめ • AWS環境ならDatabase Insightsという機能で便利に調査が可能 • 遅いクエリが特定できたらEXPLAIN でクエリの実行計画を調査 • Google CloudにもQuery

    InsightsやKey Visualizerなどの便利な調査機能がある • データベース系のMCPサーバーをつかうと、AIが調査の補助をしてくれる - 便利だが利用には注意が必要