Postgresql 不允许索引扫描,尽管存在索引



我有表格用户在哪里制作

CREATE INDEX user_status_index
ON public.users
USING btree
(status COLLATE pg_catalog."default", "keep_id" COLLATE pg_catalog."default");

当我这样做时

EXPLAIN ANALYZE select * from users where keep_id = 'pop90'

它给了我

"Seq Scan on users (cost=0.00..47284.38 rows=2 width=16) (actual time=960.463..3451.731 rows=2 loops=1)"
"  Filter: (("keep_id")::text = 'pop90'::text)"
"  Rows Removed by Filter: 1271935"
"Planning time: 0.075 ms"
"Execution time: 3451.773 ms"

为什么不进行索引扫描?

如何使它索引扫描?

任何帮助都会是可观的

您正在使用多列索引。

使用多列索引时存在一些限制。

最好创建两个单列索引。

你可以阅读这篇文章: 多列索引

多列索引

虽然 Postgres 能够创建多列索引,但了解何时这样做有意义非常重要。Postgres 查询规划器能够通过执行位图索引扫描在多列查询中组合和使用多个单列索引。通常,您可以在涵盖查询条件的每个列上创建一个索引,并且在大多数情况下,Postgres 会使用它们,因此请确保在创建它们之前对创建多列索引进行基准测试并证明其合理性。与往常一样,索引是有成本的,多列索引只能优化以相同顺序引用索引中列的查询,而多个单列索引为大量查询提供性能改进。

但是,在某些情况下,多列索引显然是有意义的。列 (a, b( 上的索引可以由包含 WHERE a = x 和 b = y 的查询或仅使用 WHERE a = x 的查询使用,但不会被使用 WHERE b = y 的查询使用。因此,如果这与应用程序的查询模式匹配,则值得考虑多列索引方法。另请注意,在这种情况下,单独创建索引将是多余的。

最新更新