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


33

有没有一种方法可以找出了解为表创建哪些索引的最佳方法?


11
有。例如,尝试使用use-the-index-luke.com
dezso

我最常看到的答案是,您应该索引WHERE子句中使用的主键和列。
Oskar Persson

请不要那样做。主键定义如何在表上对数据进行物理排序,并具有自己的考虑因素。您必须非常仔细地选择主键,因为它也在所有其他索引中使用。请参阅:sqlskills.com/blogs/kimberly/…–
Ali Razeghi

4
@AliRazeghi(物理排序)在某些DBMS(在某些情况下)中是正确的,而在其他情况下则不是。例如,在PostgreSQL中不正确。
dezso

投票回来!
2013年

Answers:


29

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

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

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

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

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

没有什么可以替代研究特定dbms的文档的了。

  • 创建索引
  • 索引(尤其要注意有关索引表达式,部分索引以及检查索引使用的部分)

14

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

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

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

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

大胆强调我的。

可能想为多列索引的第二列或后面的列创建其他索引,但是多列索引通常可以很好地覆盖第一列-除非其他列使索引大得多。我们在以下相关问题下进行了详细讨论:

复合索引对第一字段的查询是否也有用?

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

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

一般情况下,写操作(DELETEUPDATE)变得更加昂贵(但也可能受益!),而读操作(SELECT)一般只是受益。太多索引会耗尽高速缓存存储器,从而使读取操作也可能受到影响。

最终,这个在索引维护中的Postgres Wiki页面提供了用于查找重复索引或未使用索引(以及其他功能)的工具。


如果我没记错的话,还会在Oracle v。> = 10和Sql Server> = 2008上创建基于PK的自动索引
EAmez

1

有两种选择。

  1. 你做吧。
  2. 技术做到了。

您自己完成此操作的答案已在此处详尽记录。因此,让我们看看其他内容。

菲格罗

如果您需要一些自动建议,Pghero可能会为您提供帮助。

那说它有一些缺点。

  1. 它仅适用于WHEREORDER BY,没有JOINS
  2. 它仅使用有关NULL百分比和不同值的统计信息。

观看此视频以获取更多信息

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.