SQLite:优化表扫描

时间:2011-09-25 16:53:33

标签: sqlite optimization indexing full-table-scan

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

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

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

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

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

所以这可能意味着我可以添加一个ORDER BY子句来加速它。

2 个答案:

答案 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]。