在我的表中,我有一些列没有索引,在这些列中搜索值可能需要很长时间,因为SQLite会进行全表扫描。
在我的具体情况下,我正在寻找的行(值是唯一的)几乎总是在最近插入的行中。
我怀疑SQLite在执行扫描时是从最早的(第一行)开始的,有没有办法指示SQLite以相反的顺序进行表扫描?
更新:我在更改日志中找到了这个:
优化器现在将反向扫描表,如果这样做将满足ORDER BY ... DESC子句。
所以这可能意味着我可以添加一个ORDER BY子句来加速它。
答案 0 :(得分:2)
解决方案是:
ORDER BY rowid DESC LIMIT 1
它使查找闪电般快速!
答案 1 :(得分:1)
扫描的顺序(从最老到最小或最小到最旧)无关紧要,因为需要进行全表扫描。必须访问每一行。虽然你提到' 行我正在寻找'条件
.... where col = 'a'
可能会返回一行,也可能会返回10行或500行。除非您使用LIMIT指令,否则当遇到第一个匹配行时,SQLite不能简单地停止并将其称为当天的工作。
编辑:但是,您可以使用时间戳列对其进行索引,然后使用内联视图来获取相对较新的行:
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]。