1

在我的表中,有些列没有索引,在这些列中搜索值可能需要很长时间,因为 SQLite 会进行全表扫描。

在我的具体情况下,我正在寻找的行(值是唯一的)几乎总是在最近插入的行中。

我怀疑 SQLite 在进行扫描时从最旧(第一)行开始,有没有办法指示 SQLite 以相反的顺序进行表扫描?

更新:我在更改日志中找到了这个:

如果这样做会满足 ORDER BY ... DESC 子句,那么优化器现在将反向扫描表。

所以也许这意味着我可以添加一个 ORDER BY 子句来加快速度。

4

2 回答 2

2

解决方案是:

ORDER BY rowid DESC LIMIT 1

它使查找速度快如闪电!

于 2011-09-25T20:46:37.603 回答
1

扫描的顺序(从最老到最年轻或从最年轻到最老)是无关紧要的,因为需要完整的表扫描。必须访问每一行。虽然你提到'我正在寻找的行'条件

                    .... where col = 'a'

可能返回一行,也可能返回 10 行或 500 行。当遇到第一个匹配行时,SQLite 不能简单地停止并称其为美好的一天,除非您使用 LIMIT 指令。

编辑:但是,您可以做的是使用时间戳列,对其进行索引,然后使用内联视图来获取相对较新的行:

              select * from
              (
               select * from T 
               where datecreated > {somerecentdate}
              ) as myView
              where myView.someColumn = 'a'

或者干脆

            select * from T where datecreated > {some date} and somecolumn = 'a'

这种方法可能是一个迭代过程——如果没有返回任何行,您可能需要使用更宽的时间窗口重新查询。但是,如果您要索引 datecreated,您不妨索引 [someColumn]。

于 2011-09-25T17:29:49.637 回答