メニューを閉じる

テクノデジタルグループ

メニューを開く

2026.04.17

DB

【Postgres】デッドロック解消から始まった、DBインデックス最適化の記録

はじめに

こんにちは!
サービスの成長に伴いデータ量が増加してきたある日、私たちのチームを襲ったデッドロック(Deadlock)の発生

このトラブルを根本から解決すべく調査を進めた結果、PostgreSQLのインデックス設計を見直すことで、パフォーマンスを劇的に改善することができました。

今回は、そのトラブルシューティングの過程と改善結果を共有します。

デッドロック発生!

事の発端は、特定の処理が重なり合った際に発生したデッドロックでした。

PostgreSQLのログを解析したところ、データ操作(削除系)のクエリが長時間テーブルをロックしており、それが後続の処理と競合していたことが判明しました。

なぜそれほど長時間ロックがかかっていたのか? 原因はインデックス不足にありました。

調査

対象のテーブルにはいくつかの複合インデックスは設定されていましたが、ほとんどノータッチでした。

実態はフルスキャン(Seq Scan)
検索条件とインデックスの定義が合致しておらず、数万件のデータを毎回フルスキャンしていました。

ロック時間の長期化
検索に時間がかかる=トランザクションが維持される時間が長くなり、デッドロックを誘発しやすい状態になっていたのです。

プロジェクト発足時からあまりDBの見直しは行われておらず、サービス拡大によってパフォーマンス低下とデッドロックの引き金になっていました。

レスポンス速度と安定性の向上

クエリに最適化したインデックスを追加したところ、レスポンスタイムは以下のように劇的に変化しました。

改善対象 リリース前 リリース後 改善率
ユーザー操作 A (削除系) 2.28s 506ms 約77%短縮
ユーザー操作 B (削除系) 2.95s 753ms 約74%短縮

これまで3秒近くかかっていた処理が、1秒未満(500ms〜750ms程度)まで高速化されました。

これにより、ロックを保持する時間そのものが短時間となり、課題だったデッドロックの発生を抑え込むことに成功しました。

まとめ

今回のデッドロック対応を通して、以下の教訓を得ました。

  1. デッドロックの原因は「時間」にあることも多い
    処理が遅い(=ロックが長い)だけで、競合のリスクは跳ね上がります。
  2. 「クエリ」に合わせたインデックス
    全データを1件ずつ調べるフルスキャンを回避し、特定のデータへ最短ルートでアクセスすることが、検索速度の向上だけでなくロック解放を早める鍵となります。
  3. コードの改善も並行して
    インデックスで解決しないケースは、コードの構造自体をリファクタリングする必要があります。

インデックス一つで劇的にパフォーマンスが改善されることを実感しました。
改善結果には達成感もありましたが、裏を返せば設計のイケてなさ考慮不足があったということ。
今後は、サービスの成長を見越した負債を溜めない設計を徹底していきます!


【記事への感想募集中!】

記事への感想・ご意見がありましたら、ぜひフォームからご投稿ください!
  • こんな記事が読んでみたい、こんなことが知りたい、調べてほしい!という意見も募集中!
  • いただいた感想は今後の記事に活かしたいと思います!

感想フォームはこちら


【テクノデジタルではエンジニア/デザイナーを積極採用中です!】

下記項目に1つでも当てはまる方は是非、詳細ページへ!
  • 自分でアプリを作ってみたい
  • ITで世の中にワクワクを生み出したい
  • 使いやすさ、デザインにこだわったWebサイトを開発したい

採用情報の詳細はこちら


Qangaroo(カンガルー)

  • 徹底した見やすさと優れた操作性で、テストの「見える化」を実現。
  • テストの進捗が見える。開発がスマートに進む。
  • クラウド型テスト管理ツール『Qangaroo(カンガルー)』

【テクノデジタルのインフラサービス】

当社では、多数のサービスの開発実績を活かし、
アプリケーションのパフォーマンスを最大限に引き出すインフラ設計・構築を行います。
AWSなどへのクラウド移行、既存インフラの監視・運用保守も承りますので、ぜひご相談ください。
詳細は下記ページをご覧ください。

https://www.tcdigital.jp/infrastructure/

最近の記事