如果你在谈论btree,我不会想象非聚集索引的额外开销(不计算全文搜索或其他类型的字符串索引等)甚至可以测量,除了极高的音量写场景。
我们实际谈论的是什么样的开销?为什么只是索引所有内容是一个坏主意?这个实现是否具体? (在这种情况下,我最感兴趣的是围绕pg的答案)
编辑:为了解释这背后的原因......
我们正在寻求全面改善性能,我们正在关注的一个关键问题是查询性能。我已经阅读了这里提到的内容,索引会增加磁盘上的db大小并减慢写入速度。今天出现了一个问题,当时一对在新表上做了一些先发制人的索引,因为我们通常以更具反应性的方式应用索引。他们的论点是他们没有索引字符串字段,他们没有做聚簇索引,所以可能冗余索引的负面影响几乎不可测量。
现在,我不是这方面的专家,根据我的理解,这些论点对我很有意义。
现在,我确信还有其他原因,或者我误解了一些事情。我知道冗余索引会产生负面影响,我想知道它会有多糟糕(因为它似乎可以忽略不计)。整个索引每个字段的事情是最糟糕的情况,但我想如果人们可以告诉我这将对我的数据库做什么,它将帮助我理解关于保守索引的问题,或者只是把它扔到那里当它有提供帮助的可能性。
答案 0 :(得分:3)
随机想法
答案 1 :(得分:1)
简而言之,索引(无论是聚簇索引还是非索引)会向“树”添加额外的“分支”,其中数据由大多数当前DBMS存储。这使得使用索引对数时间而不是线性时间的单个唯一组合来查找值。访问时间的减少加速了DB执行的许多常见任务;但是,当执行除此之外的任务时,它可以减慢速度,因为必须通过树访问数据。例如,基于非索引列的过滤需要引擎迭代树,并且因为分支节点(仅包含指向树中其他位置的指针)与叶节点的比率已经减少,这将花费比如果指数不存在。
此外,非聚集索引根据列值分隔数据,但如果这些列值在所有表行中不是非常唯一(如表示“是”或“否”的标志),则索引会添加额外的实际上没有帮助搜索的复杂程度;事实上,它阻碍了它,因为在从树的根导航到树的叶子时,会遇到额外的分支。
答案 2 :(得分:1)
我确信听到的确切可能是具体的实施方式,但我的头脑中有一点: