拥有多个指数有哪些缺点?

时间:2009-04-18 21:08:04

标签: sql database sqlite indexing rdbms-agnostic

我最近通过为SQLite提供了一个很好的索引来加快一个复杂的查询速度。这样的结果让我想知道是否应该索引常用于JOIN或ORDER BY子句的许多其他字段。但是我不想过度热心并且反感我:我认为必须有一些原因来创建索引,或者默认情况下每个字段都会被索引。

我在这种情况下使用SQLite,但当然也欢迎DBMS不可知的建议。

4 个答案:

答案 0 :(得分:40)

索引会降低插入和更新速度(这可能会成为严重的锁定问题)并降低成本磁盘空间。这就是它。

答案 1 :(得分:6)

索引占用磁盘空间来存储,并且需要时间来创建和维护。未使用的没有任何好处。如果查询有许多候选索引,则可以通过让服务器为查询选择“错误”索引来减慢查询速度。

使用这些因素来决定是否需要索引。

通常可以创建永远不会被使用的索引 - 例如,只有两个可能值的(非空)字段上的索引几乎肯定是无用的。

您需要解释自己的应用程序的查询,以确保频繁执行的查询在可能的情况下使用合理的索引,并且不要创建比执行此操作所需的索引更多的索引。

答案 2 :(得分:6)

为了测试您的特定应用程序,您可以在运行的任何查询前放置“EXPLAIN QUERY PLAN”并检查结果。它会告诉你它在哪里或者没有使用索引。

通过这种方式,您可以确定可以使用更多索引的位置以及它们不会产生影响的位置。

Sqlite Explain

我使用SqliteSpy手动测试似乎导致问题的查询。

答案 3 :(得分:5)

磁盘空间中索引的成本通常很小。在表更改时更新索引的额外写入的成本通常是适中的。额外锁定的成本可能很高。

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