我正在为现有 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=...)
<- 索引,好
在我的优化任务中,我发现了一个比较大的表,它偶尔会遇到性能问题,并为此创建了一个索引。这是将顺序扫描转换为上述索引扫描的完美示例。有效。
但是,在创建索引后,第二个在列表中排名最慢的查询,仍然不到 0.5 秒,即索引没有任何区别!创建索引后,它仍然会执行Seq Scan
. 该表虽然有几百条记录,但每年可能会增长几千条。
在 PostgreSQL 文档中更深入地挖掘它说,当使用所述索引没有显着提高性能时,它仍然会使用顺序扫描。
然后是可怕的部分:建议您运行ANALYZE
或启用“Autovacuum”守护程序。这样,数据库将知道表的大小并正确地决定查询计划。
我知道使用索引是相当基本的,那么这在生产环境中是绝对必要的吗?换句话说,PostgreSQL 会在需要使用索引时使用它,而不需要分析或清理作为额外任务吗?