PostgreSQL会自动生成索引吗?

12

PostgreSQL中是否有自动索引,还是需要用户显式创建索引?如果有自动索引,如何查看它们?谢谢。


2
请阅读手册:http://www.postgresql.org/docs/current/static/ddl.html - user330315
1
PostgreSQL会在创建表时自动为主键创建索引。在命令行中,它会告诉你已经创建了索引以及它的名称。 - okaram
1个回答

15

主键和唯一约束条件上的索引将自动生成。使用CREATE INDEX 来创建更多的索引。要查看现有数据库结构,包括索引,请使用 \d table

快速生成索引的一个示例:

CREATE INDEX unique_index_name ON table (column);

您可以在多个列上创建索引:

CREATE INDEX unique_index_name ON table (column1, column2, column3);

或者一个部分索引,只有在满足条件时才会存在:

CREATE INDEX unique_index_name ON table (column) WHERE column > 0;

还有很多其他操作可以使用,但需要参考上述链接的文档。另外,如果您在生产数据库上创建索引,请使用CREATE INDEX CONCURRENTLY(这可能需要更长时间,但不会锁定表格以阻止新写入)。如果您有其他问题,请告诉我。


更新:

如果想要用纯SQL查看索引,请查看pg_catalog.pg_indexes表:

SELECT *
FROM pg_catalog.pg_indexes
WHERE schemaname='public'
AND tablename='table';

好的,当我手动在主键上创建索引时,我发现查询计划与没有显式索引计划不同。为什么会出现这种情况? - user3419945
1
您需要更新您的问题并提供两个查询计划。由于有许多索引类型,因此可能会导致差异(如果PostgreSQL认为顺序扫描比使用索引更有效,则不会使用索引)。 - Sam
谢谢@Sam,我创建了一个索引(CREATE INDEX full_edge_idx ON full_edge (edge);),如果我运行升级查询,没有结果。如果我再次运行(CREATE INDEX full_edge_idx ON full_edge (edge);),它会显示错误:关系“full_edge_idx”已经存在SQL状态:42P07。 - user3419945
我看到了我的错误,谢谢。另一个问题是,如果我没有显式地创建索引,并且查询SELECT * FROM pg_catalog.pg_indexes WHERE tablename='full_edge';返回空值,这是否意味着尽管PostgreSQL可以创建索引,但它认为不值得使用索引,因此不会创建索引? - user3419945
1
排除约束还会自动添加其索引(虽然不常用)http://www.postgresql.org/docs/current/static/ddl-constraints.html#DDL-CONSTRAINTS-EXCLUSION - pozs
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接