拥有许多索引的缺点是什么?

17

最近我通过给SQLite一个好的索引,将一条复杂查询的速度提高了一个数量级。这样的结果让我想知道是否应该为其他经常用于JOIN或ORDER BY子句的字段创建索引。但我不想太过热心而导致适得其反:我认为一定有一些原因创建索引,否则每个字段都会默认创建索引。

在这种情况下我使用的是SQLite,但当然如果有与DBMS无关的建议也欢迎。

4个回答

42

索引会减缓插入和更新的速度(这可能会导致锁定等严重问题),并且会增加磁盘空间成本。就是这样。


2
这就是全部内容了。不要忘记,为了获得良好的插入/更新/删除性能,您确实需要适当的索引。像所有事情一样,这是一个平衡问题。 - Michael Haren
6
插入操作不会受益于索引……更新和删除操作需要找到相关的行,所以在此步骤中使用索引是有益的,但是如果你有太多的索引,甚至这个好处也可能被抵消。正如你所说,这一切都取决于平衡。 - MatBailie

6
索引会占用磁盘空间,并花费时间创建和维护。未使用的索引没有任何好处。如果有大量候选索引用于查询,则服务器选择“错误”的索引可能会减慢查询速度。
使用这些因素来决定是否需要索引。
通常可以创建永远不会使用的索引-例如,在仅具有两个可能值的(非空)字段上创建索引几乎肯定是无用的。
您需要解释自己应用程序的查询,以确保尽可能使用明智的索引执行频繁执行的查询,并且不要创建超过所需数量的索引。

当分布极不平衡并且数据库通过统计数据知道这一点时,对一个双值字段进行索引有时会非常有用。 - Mike Woodhouse

6
为了测试您的特定应用程序,您可以在运行任何查询之前加上“EXPLAIN QUERY PLAN”,然后检查结果。它将向您显示它是否使用索引。
这样,您就可以确定在哪里可以使用更多的索引以及它们不会有任何影响的地方。 Sqlite Explain 我使用SqliteSpy手动测试似乎有问题的查询。

5

索引占用磁盘空间的成本通常微不足道。当表发生更改时,更新索引所需的额外写入成本通常是适度的。额外锁定的成本可能会很大。

这取决于表的读写比率以及索引实际用于加速查询的频率。


1
嗯,取决于表格和被索引的字段,磁盘空间成本并不总是微不足道的。我曾经遇到过许多情况,其中索引空间的总和是表格空间总和的两倍(或更多)... - MatBailie
赞同民主党的观点;对于一个窄表,非聚集索引的大小可以与表本身相当。假设索引的磁盘空间成本是表本身的一半;那么有六个索引的表在磁盘上比未建立索引的表大四倍。聚集索引基本上是免费的。 - Steve Cooper
1
不,索引在磁盘空间上的成本并非“通常微不足道”。使用索引可能会占用大量空间。 - MarkR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接