在我的表中,有些列没有索引,在这些列中搜索值可能需要很长时间,因为 SQLite 会进行全表扫描。
在我的具体情况下,我正在寻找的行(值是唯一的)几乎总是在最近插入的行中。
我怀疑 SQLite 在进行扫描时从最旧(第一)行开始,有没有办法指示 SQLite 以相反的顺序进行表扫描?
更新:我在更改日志中找到了这个:
如果这样做会满足 ORDER BY ... DESC 子句,那么优化器现在将反向扫描表。
所以也许这意味着我可以添加一个 ORDER BY 子句来加快速度。
在我的表中,有些列没有索引,在这些列中搜索值可能需要很长时间,因为 SQLite 会进行全表扫描。
在我的具体情况下,我正在寻找的行(值是唯一的)几乎总是在最近插入的行中。
我怀疑 SQLite 在进行扫描时从最旧(第一)行开始,有没有办法指示 SQLite 以相反的顺序进行表扫描?
更新:我在更改日志中找到了这个:
如果这样做会满足 ORDER BY ... DESC 子句,那么优化器现在将反向扫描表。
所以也许这意味着我可以添加一个 ORDER BY 子句来加快速度。
解决方案是:
ORDER BY rowid DESC LIMIT 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]。