インデックスは「魔法の杖」ではない
多くの新人エンジニアが陥る罠として、パフォーマンスが低下した際に「とりあえずインデックスを貼れば速くなるだろう」という安易な発想があります。しかし、実務の現場において、インデックスは諸刃の剣です。むやみに作成すれば、検索速度は向上しても、データの挿入や更新(INSERT/UPDATE)のたびにインデックスの再構築コストが発生し、システム全体の書き込み性能が著しく低下します。
「実行計画」という唯一の真実
インデックスを作成する際、もっとも避けるべきは「なんとなく」で作成することです。必ず「実行計画(EXPLAIN)」を確認する習慣をつけてください。私が以前担当した案件では、インデックスを貼ったにもかかわらず、データベースのオプティマイザが「フルスキャンの方が速い」と判断し、インデックスが無視されるケースがありました。データのカーディナリティ(値の重複度)が低いカラムにインデックスを貼っても意味がありません。データの分布を理解し、クエリがどのインデックスを実際に利用しているかを確認することが、DBAとして最初の仕事です。
複合インデックスの順序がパフォーマンスを左右する
複数のカラムを組み合わせた複合インデックスを作成する際は、その並び順が重要です。基本原則は「等価条件(WHERE句で=で指定するもの)を左側に、範囲条件(>や<など)を右側に配置する」ことです。また、左端一致の法則を忘れてはなりません。複合インデックスの左側のカラムがWHERE句に含まれていない場合、そのインデックスは機能しません。実務では「最も頻繁に検索される組み合わせ」だけでなく、アプリケーションのアクセスパターン全体を俯瞰して、最も効率的な列の順序を設計する力が求められます。
本番環境での「オンライン作成」を意識する
大規模なデータベースにおいて、数百万件のテーブルにインデックスを追加すると、ロックが発生してサービスが停止するリスクがあります。最近の商用データベースやPostgreSQLなどでは、オンラインでのインデックス作成(CREATE INDEX CONCURRENTLYなど)がサポートされています。しかし、これらもCPUやI/Oに負荷をかけます。深夜のメンテナンス時間帯を狙うのか、あるいは低負荷な時間帯に慎重に行うのか。インデックスを「いつ、どうやって作成するか」という運用設計までを含めて、私たちはインデックスと向き合う必要があります。
インデックス作成は、単なる技術的な作業ではありません。ビジネス要件とシステムのリソースを天秤にかけ、最適なバランスを見つけるという「意思決定」なのです。

コメント