既存の PostgreSQL データベース インスタンスのテーブルにインデックスを作成しています。EXPLAIN ANALYZE
インデックスが使用されているかどうかを確認するには、アプリケーションの SQL コマンドを実行するのが最も簡単な方法であることを理解しています。
例えば:
EXPLAIN ANALYZE SELECT A,B,C FROM MY_TABLE WHERE C=123;
私に返してくれますか:
Seq Scan on public.my_table (cost=...)
<- インデックスなし、悪い
そして、インデックスを作成すると、次のように返されます。
Index Scan using my_index_name on public.my_table (cost=...)
← インデックス、GOOD
私の最適化タスクでは、時折パフォーマンスの問題が発生する比較的大きなテーブルを見つけ、そのテーブルのインデックスを作成しました。これは、上記のようにシーケンシャル スキャンをインデックス スキャンに変える完璧な例でした。出来た。
ただし、インデックスを作成した後、リストで最も遅くランク付けされた 2 番目のクエリは、まだ 0.5 秒未満でした。つまり、インデックスは何の違いもありませんでした。インデックスが作成された後も、Seq Scan
. ただし、テーブルには数百のレコードがありますが、年間数千のレコードが増える可能性があります。
PostgreSQLのドキュメントをもう少し深く掘り下げると、上記のインデックスを使用してもパフォーマンスが大幅に向上しない場合でも、順次スキャンを使用すると述べています。
それから恐ろしい部分: ANALYZE
"Autovacuum" デーモンを実行するかオンにすることをお勧めします。このようにして、データベースはテーブルのサイズを認識し、クエリ プランを適切に決定します。
インデックスの使用はかなり基本的なことだと理解していますが、これは本番環境で絶対に必要ですか? 言い換えれば、PostgreSQL は、余分なタスクとして分析やバキューム処理を行う必要なく、必要なときにインデックスを使用するのでしょうか?