有没有一种方法可以找出了解为表创建哪些索引的最佳方法?
WHERE
子句中使用的主键和列。
有没有一种方法可以找出了解为表创建哪些索引的最佳方法?
WHERE
子句中使用的主键和列。
Answers:
简短的经验法则。(其中一些是自动创建的,但可能会在以后根据dbms手动删除。不要以为您将始终在PostgreSQL上工作。)
每个主键意味着多列主键应具有覆盖所有列的单个索引。如果您声明多列主键,PostgreSQL将自动创建该索引。
在许多情况下,单个多列索引要比几个单列索引提供更好的性能。监控慢速查询并进行测试以找出哪个。
假设对索引的任何更改都会改善某些数据库活动,并降低其他活动。我发现拥有一组可以在更改索引前后进行配置的SQL语句很有帮助。该集合包括SELECT,INSERT,UPDATE和DELETE语句。
没有什么可以替代研究特定dbms的文档的了。
除了@Catcall已经提供的内容之外,并添加一些小的更正:
最近,在关于SO的这个密切相关的答案中,我还介绍了一些基础知识。
到目前为止的答案似乎表明您需要在主键上创建索引,但是在PostgreSQL中并非如此(部分例外适用)。我在这里引用手册:
当为表定义唯一约束或主键时,PostgreSQL自动创建唯一索引。该指数涵盖构成主键或唯一约束的列(多列索引,如果合适的话),并且是强制约束的机制。
大胆强调我的。
您可能想为多列索引的第二列或后面的列创建其他索引,但是多列索引通常可以很好地覆盖第一列-除非其他列使索引大得多。我们在以下相关问题下进行了详细讨论:
在PostgreSQL中,多列索引,局部索引和表达式索引是特别强大的工具。从PostgreSQL 9.2开始,还有仅索引扫描,等效于其他RDBMS中的“覆盖索引”。这不是另一种索引类型,而是RDBMS具有现有索引类型的新功能。
每个索引都有特定的成本,因此没有一些基础知识可以真正优化索引。仅创建更多索引弊大于利。特别是,索引可以防止HOT更新提高性能。
一般情况下,写操作(DELETE
,UPDATE
)变得更加昂贵(但也可能受益!),而读操作(SELECT
)一般只是受益。太多索引会耗尽高速缓存存储器,从而使读取操作也可能受到影响。
最终,这个在索引维护中的Postgres Wiki页面提供了用于查找重复索引或未使用索引(以及其他功能)的工具。