在SQLite3中,速度是否有“太多索引”这样的东西?

时间:2014-05-14 12:50:16

标签: sqlite

我想提高SQLite3数据库的性能。我首先采用最极端的行动(只是为了看看会发生什么),并为数据库中每个表的每一列添加一个索引。

数据库大小增加了一倍以上,令我惊讶的是,性能急剧下降。我以前每秒获得4000次选择的地方现在每秒可以获得50次选择。

这个问题并不是我的具体情况。我的问题是; 添加索引是否有可能降低SQLite3中的 SELECT性能?我问,因为我想知道我的问题是我添加了太多索引,还是我在某个地方犯了一个导致速度减慢的错误。


更具体地说明 my 案例:数据库从140 MB增加到280 MB,我有一个SSD。

1 个答案:

答案 0 :(得分:1)

有一种机制可以使其他索引导致速度放缓:

  1. 大多数优化决策都是针对最糟糕的情况而设计的 - 当您访问的数据太大而无法放入任何缓存并且必须从磁盘加载时。

    如果数据本身适合缓存,但查询使用的所有各种索引都非常大,以至于整个工作集变得太大,您将获得更多交换。

  2. SELECT查询将忽略任何实际未使用的索引。 但是,INSERT / UPDATE / DELETE语句必须更新已更改表的所有索引,因此每个附加索引都会减慢此类更改。

  3. 使用EXPLAIN QUERY PLAN检查查询实际使用的索引。

    阅读Query PlanningThe SQLite Query Planner以了解如何使用索引。