STATUS IS UPウェブサイト最適化ウィキ
26堅牢化
パフォーマンスと配信 / 堅牢化

コンテンツとコマースサイト向けのデータベース性能

高コストなデータベース処理を見つけ、重要な経路を改善し、信頼性リスクを増やさずに性能変更をリリースする方法。

コンテンツとコマースサイト向けのデータベース性能 — ビジュアルガイド
読む
8 分
出典
8
再検証
2027-03-27
レビュー済み
アプリケーション、セキュリティ、リリースの文脈を持つデータベース信頼性レビュアー
短い答え

まず決断から始める。

遅いユーザーリクエストから出発して、そのデータベース作業を特定します。代表的なクエリを計測し、実行計画を確認して、1回に1つ、実証された制約を変更します:クエリ形状、インデックス、ページネーション、キャッシュ挙動、または接続の使い方。結果は引き続き正しいコンテンツ、価格、在庫、権限を返す必要があります。

コンテンツとコマースのサイトでは、対象を絞った計測と保守的なデリバリが有効です。安全に共有できる読み取り応答をデータベース外に置く、パーソナライズされたデータを正しくスコープする、通常の処理と復旧のための容量を残す。現実的なトラフィックでテストし、段階的にリリースし、既知の正常なアプリケーション版に戻す手順を維持してください。

ビジュアルガイド

作業をシステムとして見る。

個別の戦術に取り掛かる前に、この記事の意思決定をこのマップで結び付けてください。

SIU堅牢化
01データベースを変更する前に高コストのリクエストを見つける
02実際に使うアクセス経路に合わせてインデックスを設計する
03ページネーションを安定かつ負担の少ないものにする
04誤った応答を返さないように読み取りをキャッシュする
01

データベースを変更する前に高コストのリクエストを見つける

カテゴリ表示、記事検索、カートへの追加、注文送信など、ユーザーの操作から始めます。その経路、クエリ数、データベース処理時間、返された行数、リクエスト時間を記録してください。ページの遅延はアプリケーションコードや他の依存先が原因の場合もあるため、ページ読み込み時間だけで診断してはいけません。

実行計画はテーブル、インデックス、結合、ソート、集計を通るデータベースの経路です。PostgreSQL では EXPLAIN がその経路を示します。EXPLAIN ANALYZE はステートメントを実行し、実際の行数とタイミングを報告するので、代表的で安全なクエリを使ってください。推定行数と実際の行数に大きな乖離がある場合は、統計や条件を調査する理由になりますが、自動的にインデックスを追加すべきという意味ではありません。

1つの経路を追跡する

候補クエリを経路と結果に結び付け、ダッシュボードだけのレポートが遅いチェックアウトより優先されないようにします。

ベースラインを保持する

変更前の計測値と比較可能なトラフィックを記録します。顧客識別子、トークン、カード関連値は記録しないでください。

02

実際に使うアクセス経路に合わせてインデックスを設計する

インデックスは行の位置特定や順序で返すのを助ける維持構造であり、万能の高速化スイッチではありません。まず重要なクエリのフィルタ、結合キー、ソート順を確認し、提案するインデックスが実行計画で有効か確かめてください。PostgreSQL のドキュメントは、マッチする B-tree インデックスが、特に小さな LIMIT と組み合わせた場合に、別個のソートなしで ORDER BY を満たせることを示しています。

インデックスはストレージと書き込みコストを増やします。挿入・更新・削除でインデックスが維持されるからです。テーブルの大部分が必要なクエリでは、シーケンシャルスキャンと明示的なソートの方が速い場合があります。本番に近いデータでテストし、利益がコストに見合う場合にのみインデックスを維持してください。

アクセス経路に合わせる

クエリの実際のフィルタと ORDER BY を使い、インターフェイスが安定した順序を必要とする場合は決定論的なタイブレーカーを含めてください。

憶測的なインデックスを避ける

インデックスが使われているか、書き込み時に何をコストとしているかをレビューし、データやトラフィックが変わったら再確認してください。

03

ページネーションを安定かつ負担の少ないものにする

ページ番号方式のページネーションは通常 LIMIT と OFFSET を使います。必ず予測可能な順序を課してください。PostgreSQL は ORDER BY がないと LIMIT が予測不能なサブセットを返す可能性があると警告しており、異なる LIMIT や OFFSET 値で最適化器が別の計画を選ぶため、一貫しない結果になることがあります。

大きな OFFSET は注意が必要です。スキップされた行も計算されるためです。カタログの深い閲覧、注文履歴、アーカイブ閲覧には、カーソルやキーセット(keyset)ページネーションを検討してください:最後に見た安定したソート値と一意のタイブレーカーの後の行を要求します。インターフェイス変更前に、新規または削除されたレコードがどう現れるか定義してください。

固定のページサイズを設定する

無制限の結果ではなく、最小限で有用なページを返してください。

総件数を切り離す

インターフェイスが本当に毎回正確な総件数を必要としているか決めてください。

04

誤った応答を返さないように読み取りをキャッシュする

キャッシュはデータベースから再構築する代わりに以前の結果を再利用します。公開され、繰り返し参照されるページやバージョン管理されたアセットではまず HTTP レイヤーから始めてください。キャッシュヒットはアプリケーションとデータベースの作業を回避できます。web.dev はバージョン付き URL に対する長寿命キャッシュを推奨しており、URL を変更することが実用的な無効化手段です。

キャッシュポリシーは正確性(correctness)の判断です。共有キャッシュは1つの応答を複数のユーザーで再利用するため、アカウント、カート、価格、認可固有の出力は、そのスコープで設計およびテストされていない限り共有しないでください。Cache-Control の private はブラウザキャッシュへの再利用に制限し、no-store はキャッシュに保持しないよう指示します。

応答を分類する

公開カタログや記事の出力を、セッション固有、位置情報固有、権限感度の高い出力と分けてください。

新鮮さをテストする

誰がどの程度古い値を許容するか、期間、および無効化または再検証の経路を定義してください。

05

単に上限を上げる代わりに接続容量を保護する

接続はデータベースへのライブなクライアントセッションです。ワーカー、cron ジョブ、プレビュー、リトライがスロットを使い果たすことがあり、個々のクエリが許容範囲で見えても枯渇する場合があります。PostgreSQL の max_connections は同時接続数を制御し、サーバ起動時に設定され、値を大きくすると共有メモリを含むより多くのリソースが割り当てられます。ワークロードモデルなしで引き上げると失敗が別の形で移動する可能性があります。

Web ワーカー、バックグラウンドジョブ、管理操作、レプリカをまたいで1つの予算を設定してください。適切な箇所でバウンデッドプーリングを使い、復旧のための余裕を残し、放置された作業が無期限に待たないようタイムアウトを適用します。安全な数値はエンジン、メモリ、クエリの混在、プロバイダ制限によって異なるため、運用担当者と確認してください。

すべてのクライアントを数える

Web プロセス、キュー、定期タスク、マイグレーション、レポーティングツール、デプロイジョブを含めてください。

リトライを制限する

同時実行数を上限し、フォールトが接続需要を増幅しないようバックオフを使ってください。

06

文脈とプライバシー制御でクエリコストを観測する

データベースの作業は単一の遅いサンプルではなく、総合的な影響で順位付けしてください。数千回呼ばれる中程度に遅いクエリの方がまれなレポートより重要なことがあります。PostgreSQL の pg_stat_statements は呼び出し数、合計・平均実行時間、行数、バッファ活動などを集約します。これを追加・削除するにはサーバ設定と再起動が必要で、プランニングの追跡はオーバーヘッドを伴います。

クエリグループを経路、リリースバージョン、時間窓に結び付けてください。OpenTelemetry はリテラルを置換してサニタイズした後にクエリテキストを収集すること、グルーピングには低カードinality のクエリサマリを使うことを推奨しています。これによりオーナーは顧客データをエクスポートしたり、あらゆる値のためのラベルを作成することなく傾向を把握できます。

テールと集計を監視する

期間、合計時間、呼び出し回数、エラー、接続、行数を確認してください。それぞれが異なる失敗モードを露呈します。

テレメトリをサニタイズする

パラメタライズドクエリを使い、トレースやログがアプリケーション外に出る前にリテラルが除去されていることを検証してください。

07

信頼性を損なわない形でデータベース変更を出荷する

インデックス、リライト、キャッシュポリシー、プール設定、スキーマ変更は、オーナー、成功計測、ロールバック判断を持つ本番変更として扱ってください。代表的な環境で検証し、限定的なスライスへリリースして影響を受ける経路を監視します。速くなっただけでは、変更が誤った、欠落した、重複した、または古いデータを返すなら成功ではありません。

スキーマ変更は特に注意が必要です。アプリケーションのバージョンが重複する可能性があるためです。Google Cloud のガイダンスは互換性の順序を説明しています:古いスキーマと新しいスキーマの両方を扱えるアプリケーションをまずリリースし、次にスキーマを変更し、最後にそれを使う機能をリリースする、という流れです。これによりアプリケーションのロールバック経路が保存されます。ロックやオンライン変更の挙動はエンジンやマネージドサービスで異なるため、高負荷や支払い関連システムでは適格なレビューを受けてください。

保護策を事前定義する

経路、性能と正確性のシグナル、ロールアウトを停止する閾値を明示してください。

カナリア後に展開する

統制されたスライスで性能と正確性を検証してから拡大し、インシデント時以外で戻る手順を練習してください。

実行 / 検証

実践的なTo‑Doガイド。

  1. 01

    1つの経路を選ぶ

    顧客に明確な影響があるページかトランザクションを選んでください。

    検証: 経路と保持すべき正しい結果が名前付きで記録されている。
  2. 02

    経路を計測する

    リクエスト時間、クエリ数、データベース処理時間、行数、接続挙動をキャプチャする。

    検証: 日付入りのベースラインが存在し、機密値が含まれていない。
  3. 03

    クエリグループを順位付けする

    統計とトレースを使って合計時間と呼び出し量で作業をランク付けする。

    検証: チームがその経路に紐づく高コストなクエリを特定できる。
  4. 04

    安全な実行計画を調べる

    代表的なステートメントでデータベースの実行計画ツールを使う。

    検証: 予測行数と実際行数、コストの高い操作が記録されている。
  5. 05

    1つの正当化された変更を選ぶ

    クエリ、インデックス、ページネーション、キャッシュ、またはプール調整とそのトレードオフを選択する。

    検証: 変更にオーナーがいてテスト証拠がある。
  6. 06

    正確性をテストする

    順序、権限、価格や在庫の可視性、必要な場合はキャッシュのスコープをテストする。

    検証: 公開およびサインイン状態それぞれで期待されるデータが返される。
  7. 07

    接続を予算化する

    Web、ワーカー、定期実行、レポーティング、管理クライアントを含める。

    検証: 合計がサービス上限未満で、復旧アクセスの余地がある。
  8. 08

    カナリアして決定する

    限定された割合にリリースし、拡大するか既知の正常版に戻すか決める。

    検証: 性能、エラー、接続、データ正確性のシグナルが決定を支持する。
議論のテーマ

トレードオフを比較し、非公開データは共有しないでください。

これらのプロンプトをチームやサイトオーナーコミュニティで使ってください。手法や学びは共有して構いませんが、認証情報や顧客データ、非公開インフラの詳細を貼り付けないでください。

  1. 01

    どの顧客経路が最も価値あるデータベース改善を明らかにし、まず何を計測しましたか?

  2. 02

    カタログやコンテンツの応答を共有キャッシュに置いて安全と判断する基準はチームでどう決めていますか?

  3. 03

    スキーマとアプリケーションのリリース順序に最も影響したロールバック制約は何でしたか?

人気/信頼できる資料

出典資料を開く。

PostgreSQL Global Development GroupUsing EXPLAIN ↗

実行計画のノードを説明し、EXPLAIN ANALYZE が何を測るかを示す。

レビュー日 2026-09-27
PostgreSQL Global Development GroupIndexes and ORDER BY ↗

B-tree インデックスがいつ順序付き結果を提供できるかを示す。

レビュー日 2026-09-27
PostgreSQL Global Development GroupLIMIT and OFFSET ↗

安定した順序要件と大きな OFFSET のコストを文書化する。

レビュー日 2026-09-27
PostgreSQL Global Development GroupConnections and Authentication ↗

接続限界、予約スロット、リソースの影響を定義する。

レビュー日 2026-09-27
PostgreSQL Global Development Grouppg_stat_statements ↗

ステートメントレベル統計の詳細、設定要件、オーバーヘッド考慮を説明する。

レビュー日 2026-09-27
web.devPrevent unnecessary network requests with the HTTP Cache ↗

Cache-Control、バージョン付き URL、無効化に関するガイダンス。

レビュー日 2026-09-27
Google CloudReliable releases and rollbacks—CRE life lessons ↗

スキーマ変更とアプリケーションのロールバックに関する互換性優先のガイダンス。

レビュー日 2026-09-27
OpenTelemetrySemantic conventions for database client spans ↗

サマリとサニタイズされたクエリテキストを用いるデータベーストレースのガイダンス。

レビュー日 2026-09-27

出典ポリシー この記事には公式ドキュメントの読解に基づく助言を使用しています。助言は条件付きであり、内部リンクはナビゲーションであって証拠ではありません。

簡単な補足

よくある質問

クエリが遅ければすぐにインデックスを追加すべきですか?

いいえ。まずそのクエリが重要かを示し、代表的なデータ上で実行計画を検査してください。インデックスは該当する検索や小さな順序付き結果を改善できますが、ストレージと書き込みコストが発生します。クエリがテーブルの大部分を必要とする場合はテーブルスキャンの方が好ましいことがあります。

OFFSET ページネーションは常に問題ですか?

いいえ。決定論的な ORDER BY を伴う浅いページには適していることがあります。スキップされた行も計算されるため深い閲覧では見直す価値があり、逐次的な閲覧にはキーセットページネーションがしばしば検討に値します。

コマースページを CDN にキャッシュできますか?

応答を分類しテストした後に限ります。公開で再利用可能なコンテンツは共有キャッシュに適する場合がありますが、カート、アカウントデータ、認可固有の出力、機微な値は制限された扱いが必要です。支払いに関わる重要なフローについては適格なセキュリティや支払いレビューを受けてください。

Status Is UP Editorial Team · Uptime Enablement Editors

レビュー: アプリケーション、セキュリティ、リリースの文脈を持つデータベース信頼性レビュアー。公開 2026-09-27、更新 2026-09-30。