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

评论

有。请尝试使用use-the-index-luke.com。

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

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

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

投票回来!

#1 楼

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


索引每个主键。
索引每个外键。
索引JOIN子句中使用的每个列。
索引WHERE子句中使用的每个列。
研究文档以学习“深奥的”索引选择您的dbms支持。

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

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

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

没有替代品可以为您特定的dbms学习文档。



CREATE INDEX

索引(尤其要注意有关索引表达式,部分索引和检查索引使用的部分)


#2 楼

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

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

到目前为止,答案似乎表示您需要在主键上创建索引,但是在PostgreSQL中不是这样(部分例外适用)。我在此处引用该手册:


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


强调粗体。

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

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

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

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

通常,写操作(DELETEUPDATE)变得更昂贵(但也可能受益!),而读操作(SELECT)通常只是受益。太多的索引会耗尽高速缓存存储器,从而甚至会影响读取操作。

最终,此Postgres Wiki页面上的索引维护功能提供了工具来查找重复或未使用的索引(以及其他内容)。

评论


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

–EAmez
19年9月9日在6:36

#3 楼

有两种选择。


您可以做到。
技术可以做到。因此,让我们看看其他内容。

Pghero

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

一些缺点。


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

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