我在索引,主键和外键方面苦苦挣扎,而且都需要全部使用它们。

如果我有两个表,它们两个都有一个整数作为主键。
第一个表通过FK引用第二个表的主键。


在两个表上我的ID列上都有主键索引
我在table1.ref_field上创建了一个FK约束,引用了第二个表(table2.id)的PK >并且在table1.ref_field上添加了一个索引


这是组织这些索引(主键和外键)的最佳方法吗?

#1 楼

您的设计很好。如果遇到性能问题(在设计时无法知道),则应在table1.ref_field列上创建索引,其顺序(ASC)与table2.id列相同。这将提高表/列之间的联接性能。维护任何索引都有开销,因此您要权衡成本与性能改进的好处。

不幸的是,PostgreSQL不会自动在引用其他列的外键列上创建此类索引。您必须自己做。

这是一个关于同一主题的StackOverflow问题:

外键和主键的Postgres和索引

这是一个查询,可帮助您确定从中添加此类索引可能会从中受益:

Postgresql:外键索引

评论


并不总是很不幸-如果您不从引用表中删除,那么它可以为您节省大量I / O和CPU,避免维护未使用的索引。我确实认为应该默认创建它,只是有一个选项可以禁止创建它。

–克雷格·林格(Craig Ringer)
13年11月25日在5:32

Craig Ringer不仅DELETE可能会对此产生影响,如果从partent表到子表中进行选择,那么您也会遇到性能问题。 Oracle的此文档详细说明了:asktom.oracle.com/pls/asktom/…

–卢西亚诺·安德列斯·马蒂尼(Luciano Andress Martini)
19年6月28日在13:48