在PostgreSQL表中创建多个索引的缺点

时间:2013-12-20 15:43:49

标签: database performance postgresql database-design indexing

阅读documentation on indexes之后,我想

嘿,因为(在我的情况下)几乎总是从数据库读取比写入它更频繁地执行,为什么不在表中的大多数字段上创建索引?

这是正确的态度吗?除了插入更长时间之外,还有其他任何缺点吗?

当然,索引将仅限于我在SELECT语句条件下实际使用的字段。

2 个答案:

答案 0 :(得分:6)

索引有几个缺点 首先,他们消耗空间。这可能是无关紧要的,但如果您的桌子特别大,可能会产生影响 其次,更重要的是,您需要记住,在INSERT新行,DELETE旧行或UPDATE索引列的现有值时,索引会有性能损失,因为现在DML语句不仅需要修改表的数据,还需要修改索引的数据。再次,这在很大程度上取决于您的应用程序用例。如果DML如此罕见以至于表现不成问题,那么这可能不是一个考虑因素 第三(虽然这与我的第一点紧密相关),请记住,每次创建另一个数据库对象时,都会产生额外的维护开销 - 这是您必须偶尔重建的另一个索引,收集统计信息(取决于RDBMS)你正在使用的另一个目标是打击数据字典等等。

底线全部归结为您的用例。如果您有经常运行的重要查询,并且可以通过此索引进行改进 - 那就去做吧。如果您在蓝色月亮中运行此查询一次,您可能不希望减慢所有INSERT语句的速度。

答案 1 :(得分:1)

在读取操作期间还有一个(小)性能缺点是拥有多个索引:你拥有的越多,Postgres花费的时间越多,评估哪个查询计划最佳。

正如您所说的那样,在条件上不使用的字段上有索引是没有意义的。它只会减慢插入速度。

请注意,在提供可疑选择性的字段上使用索引也没什么意义。根据行是否将布尔值设置为true或false,将表格粗略地分成两部分。如果真值和假值大致均匀分布,则该字段的索引对查询几乎没有好处 - 索引可能有用,因为缺少更好的选项,如果将真行和假行聚集在一起。相反,如果该字段为90%为真,那么10%的部分索引是错误的。

最后,存在存储问题:每个索引占用空间。有时(特别是GIN)比索引数据多几倍。

相关问题