最適なインデックス作成のためのMENTORの原則
勉強記録
毎日30分くらい自分のブログを読み直して復習をする時間をとっています。
今日は「SQLアンチパターン」の復習をしました!<12章>インデックスショットガン(闇雲インデックス)において、解決策として「MENTOR」の原則に基づいて効果的なインデックス管理を行うとのことだったので、MENTORとは何を指しているのかまとめます。
programming-kanamama.hatenablog.com
「インデックスショットガン」はどんなアンチパターン?
インデックスショットガンとは、パフォーマンスを最適化したいからといって、よく理解もせずに闇雲にインデックスを使用してしまうこと。
インデックスについて正しく理解していないと、以下のようなミスが起こってしまう。
インデックスを全く定義しない、または少ししか定義しない
インデックスを多く定義し過ぎる、または役に立たないインデックスを定義してしまう
インデックスを活用しないクエリを実行してしまう
つまり、十分な根拠もないままインデックスを作成したり、あるいは作成しないことがアンチパターン!
この解決策として、最適なインデックス作成を行うためのチェックリスト「MENTOR」が紹介されている。
MENTORとは
MENTORとは・・・
Measure、Explain、Nominate、Test、Optimize、Rebuildの頭文字をとったもの。
Measure(測定)
ほとんどのDBには、SQLのクエリ実行時間を記録する方法があある。
(MySQLだとスロークエリログ)
実行に時間のかかっているクエリを特定し、まずはそこから最適化に着手する。
しかし、実行に最も時間がかかっているクエリでも、実行頻度が低い場合もある。
他の単純なクエリの実行頻度が高いために、実行時間に大きく影響している場合もあるので、実行頻度の高いクエリにも注目する。
Explain(解析)
最もコストがかかるクエリを特定したら、なぜクエリの処理が遅くなっているのか原因を解析する。
クエリ実行計画(Query Execution Plan : QEP)の分析結果レポートを取得する。
※MySQLのクエリ実行計画の見方については、以前にブログでまとめています
programming-kanamama.hatenablog.com
Nominate(指名)
QEPを読んで、クエリがインデックスを使わないでテーブルにアクセスしている箇所を探す。
一部のDBには自動で修正提案してくれるツールがある。
そういったツールを使うか、自分でQEPレポートを読んで探す。
Test(テスト)
修正したクエリを再度実行して、時間を計測する。
修正したことによって効果があったのか確認する。
Optimize(最適化)
インデックスはキャッシュメモリに格納されやすい。
メモリにのっていることで、ディスクI/Oを伴う読み込みよりもパフォーマンスを改善することができる。
DBサーバーでは、キャッシュに割り当てるシステムメモリの量を設定できる。
Rebuild(再構築)
定期的にインデックスのメンテナンスを行う。
長期にわたって行の更新や削除を行うことで、インデックスは次第に不均衡になっていく。