我如何知道要为表创建哪些索引?

Nic*_*nto 40 postgresql database-design index-tuning

有没有办法找出知道为表创建哪些索引的最佳方法?

Mik*_*ll' 37

简短的经验法则。(其中一些是自动创建的,但以后可能会手动删除,具体取决于您的 dbms。不要假设您将始终在 PostgreSQL 上工作。)

  • 索引每个主键。
  • 索引每个外键。
  • 索引 JOIN 子句中使用的每一列。
  • 索引 WHERE 子句中使用的每一列。
  • 研究您的文档以了解您的 dbms 支持的“深奥”索引选项。

每个主键意味着多列主键应该有一个覆盖所有列的索引。如果您声明多列主键,PostgreSQL 将自动创建此索引。

在许多情况下,单个多列索引比多个单列索引提供更好的性能。监控慢查询并进行测试以确定哪个是哪个。

假设对索引的任何更改都会改善某些数据库活动并降低其他活动。我发现拥有一组可以在更改索引之前和之后进行分析的 SQL 语句很有帮助。该集合包括 SELECT、INSERT、UPDATE 和 DELETE 语句。

没有什么可以替代您特定 dbms 的文档。

  • 创建索引
  • 索引(特别注意有关索引表达式、部分索引和检查索引使用的部分)


Erw*_*ter 15

除了@Catcall 已经提供的内容,并添加一个小的更正:

最近还在这个与 SO 密切相关的答案中介绍了一些基础知识。

到目前为止的答案似乎表明您需要在主键上创建索引,但在 PostgreSQL 中并非如此(部分例外适用)。我在这里引用手册

当为表定义唯一约束或主键时,PostgreSQL 会自动创建唯一索引。该指数涵盖构成主键或唯一约束的列(多列索引,如果合适的话),并且是强制约束的机制。

大胆强调我的。

可能希望为多列索引的第二列或后面的列创建附加索引,但多列索引通常可以很好地覆盖第一个列 - 除非附加列使索引变得更大。我们在这个相关问题下详细讨论了这一点:

复合索引是否也适用于第一个字段的查询?

多列索引部分索引表达式索引是 PostgreSQL 中特别强大的工具。从 PostgreSQL 9.2 开始,还有仅索引扫描,相当于其他 RDBMS 中的“覆盖索引”。这不是另一种类型的索引,而是具有现有索引类型的 RDBMS 的新功能。

每个索引都带有特定的成本,因此无法绕过一些基本知识来真正优化索引。仅仅创建更多的索引弊大于利。特别是,索引可以防止HOT 更新提高性能。

通常,写操作 ( DELETE, UPDATE) 变得更加昂贵(但也可能受益!),而读操作 ( SELECT) 通常只会受益。太多的索引会耗尽缓存内存,甚至读取操作也会受到影响。

最后,这个关于索引维护的 Postgres Wiki 页面提供了用于查找重复或未使用的索引(以及其他内容)的工具。