👏

MENTORで適切なインデックス管理を

2025/02/10に公開

Daily Blogging51日目

SQLアンチパターンのインデックスショットガンのところ読んでたら初めてみる原則を見つけたので紹介する

MENTOR

最適なインデックスを作成するためのチェックリストみたいなもの
この原則に従うことで、なぜそのインデックスを作成するのか、あるいはなぜインデックスを作成しないのかを正当な理由を持って判断できるようになるよ

Measure(測定)

とにもかくにも、まずは現状の把握から行うこと
実際の数値を計測することなく憶測だけで修正箇所を考えてもダメ
※そもそもDBがボトルネックになっているとは限らない

計測することで、

  • アプリケーションの中でどのクエリが遅いのか
  • その中で使用頻度が高いクエリはどれなのか

を把握できるようになる。

この情報から、もっとも最適化のメリットがあるクエリを探してパフォーマンス改善を行っていく。

測定には、DatadogやAWS、pgheroとかが使える

Explain(解析)

改善するクエリを決めたら、今度はそのクエリの処理が遅い原因を探っていく。
そのために実行計画を利用する
実行計画を見ることで、実際にどんなインデックスが使われているのか、クエリのどの部分でコストがかかっているのかが明らかになる。

Nominate(指名)

実行計画を見て、インデックスが全く使われていない箇所を特定しよう
インデックスが全く使われず、フルスキャンが走っている場合はインデックスを作成することで
パフォーマンスが上がる可能性がある。

※postgreSQLだと、pgheroを使うことで効果のあるインデックスを提案してくれる機能を使うことができる

Test

実際にインデックスを作成した後は、その効果をちゃんと計測する。
効果を検証することで、そのインデックスの作成やパフォーマンス改善が意味のあるものであったと証明できるし、次に役立つ。

Optimize(最適化)

キャッシュメモリのサイズを検討する。
使用頻度の高いデータはキャッシュメモリに格納されやすく、インデックスはキャッシュメモリに格納されることが多くなる。
多くのデータベースでは、このキャッシュメモリのサイズはデフォルトで小さめに設定されているので、システムに応じて調整が必要

Rebuild(再構築)

定期的にインデックスを見直しましょう。
インデックスはデータ量などに応じて効果が変化していくので、一度作ったら終わりというわけではない。

まとめ

ちゃんと実態を把握した上で、ちゃんとした理由を持ってインデックスを作成しましょうねってこと

Discussion