2009-04-18 91 views
15

我最近通过给SQLite提供了一个好的索引来处理一个复杂的查询。像这样的结果让我想知道我是否应该为通常用于JOIN或ORDER BY子句的许多其他字段编制索引。但我不想过分热心,对我产生适得其反的作用:我认为必须有一些原因而不是来创建索引,或者每个字段默认都会被索引。有很多指数有什么缺点?

我使用SQLite在这种情况下,当然DBMS无关的建议是值得欢迎的为好。

回答

36

指标减缓插入和更新(它可以成为一个非常严重的问题具有锁定)和成本的磁盘空间。这是非常多的。

+2

覆盖它。不要忘记,你*确实需要适当的索引以实现良好的插入/更新/删除性能。就像所有的事情一样,这是一个平衡。 – 2009-04-19 02:49:21

+5

插入不会受益于索引...更新和删除需要查找相关的行,因此它们会从该步骤的索引中受益,但是如果您需要很多索引,则甚至可以取消该优点。正如你所说,这是一个平衡:) – MatBailie 2009-04-19 20:55:49

6

索引使用光盘空间来存储,并需要时间来创建和维护。未使用的不会给任何好处。如果查询有很多候选索引,则可以通过让服务器为查询选择“错误”查询来降低查询速度。

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

通常可以创建,它们不会使用索引 - 上(NOT NULL)领域为例,指数只有两个可能的值,几乎可以肯定将是无用的。

你需要解释自己的应用程序的查询,以确保在频繁进行的有可能的话用合理的指标,并创造没有做到这一点比需要更多的索引。

+0

索引一个双值字段可以(偶尔)在分布非常不均匀时有用 - 并且数据库通过统计知道它。 – 2009-04-19 16:52:59

5

磁盘空间索引的成本通常是微不足道的。在表更改时额外写入以更新索引的成本通常较低。额外锁定的成本可能很高。

这取决于读VS在桌子上写比例,该指数是如何经常实际使用,加快查询。

6

为了测试特定的应用程序,你可以把“解释查询计划”,在你运行的任何查询前,检查结果。它会告诉你它在哪里或不在使用索引。

通过这种方式,您可以确定哪些地方可以使用更多索引,以及哪些地方不会有所作为。

Sqlite Explain

我用SqliteSpy手测试查询的,似乎是造成麻烦。