非聚集索引添加了什么样的开销?

时间:2010-10-01 16:51:42

标签: sql postgresql indexing

如果你在谈论btree,我不会想象非聚集索引的额外开销(不计算全文搜索或其他类型的字符串索引等)甚至可以测量,除了极高的音量写场景。

我们实际谈论的是什么样的开销?为什么只是索引所有内容是一个坏主意?这个实现是否具体? (在这种情况下,我最感兴趣的是围绕pg的答案)

编辑:为了解释这背后的原因......

我们正在寻求全面改善性能,我们正在关注的一个关键问题是查询性能。我已经阅读了这里提到的内容,索引会增加磁盘上的db大小并减慢写入速度。今天出现了一个问题,当时一对在新表上做了一些先发制人的索引,因为我们通常以更具反应性的方式应用索引。他们的论点是他们没有索引字符串字段,他们没有做聚簇索引,所以可能冗余索引的负面影响几乎不可测量。

现在,我不是这方面的专家,根据我的理解,这些论点对我很有意义。

现在,我确信还有其他原因,或者我误解了一些事情。我知道冗余索引会产生负面影响,我想知道它会有多糟糕(因为它似乎可以忽略不计)。整个索引每个字段的事情是最糟糕的情况,但我想如果人们可以告诉我这将对我的数据库做什么,它将帮助我理解关于保守索引的问题,或者只是把它扔到那里当它有提供帮助的可能性。

3 个答案:

答案 0 :(得分:3)

随机想法

  • 索引当然有益于阅读
  • 你应该指出你获得最大收益的地方
  • 大多数数据库都是> 95%读取(考虑更新,FK检查,重复检查等=读取)
  • “Everything”毫无意义:大多数索引需要与包含
  • 合成
  • 定义高容量我们每天有15-20万个新行使用索引

答案 1 :(得分:1)

Introduction to Indices

简而言之,索引(无论是聚簇索引还是非索引)会向“树”添加额外的“分支”,其中数据由大多数当前DBMS存储。这使得使用索引对数时间而不是线性时间的单个唯一组合来查找值。访问时间的减少加速了DB执行的许多常见任务;但是,当执行除此之外的任务时,它可以减慢速度,因为必须通过树访问数据。例如,基于非索引列的过滤需要引擎迭代树,并且因为分支节点(仅包含指向树中其他位置的指针)与叶节点的比率已经减少,这将花费比如果指数不存在。

此外,非聚集索引根据列值分隔数据,但如果这些列值在所有表行中不是非常唯一(如表示“是”或“否”的标志),则索引会添加额外的实际上没有帮助搜索的复杂程度;事实上,它阻碍了它,因为在从树的根导航到树的叶子时,会遇到额外的分支。

答案 2 :(得分:1)

我确信听到的确切可能是具体的实施方式,但我的头脑中有一点:

  • 增加磁盘空间要求。
  • 所有写入(插入,更新,删除)的成本更高,因为必须更新所有索引。
  • 无意中听到事务锁定增加(必须在事务中更新所有索引,导致需要更多锁定等)。
  • 查询优化器的复杂性可能会增加(选择哪个索引最有可能表现最佳;当另一个索引实际上更好时,也可能选择一个索引)。