1


我有一个 sqlite db,目前只有几个表,其中最大的一个有超过 10,000 行。该表有四列:id、term、definition、category。我使用了 FTS3 模块来加快搜索速度,这很有帮助。但是,现在当我尝试从表中获取“下一个”或“上一个”行时,它需要的时间比我开始使用 FTS3 之前要长。

这就是我创建虚拟表的方式:

CREATE VIRTUAL TABLE profanity USING fts3(_id integer primary key,name text,definition text,category text);

这就是我获取下一行/上一行的方式:

SELECT * FROM dictionary WHERE _id < "+id + " ORDER BY _id DESC LIMIT 1
SELECT * FROM dictionary WHERE _id > "+id + " ORDER BY _id LIMIT 1

当我在虚拟表上运行这些语句时:

  • 下一个术语是在~300ms内获取,
  • 上一个术语是在~200ms内获取

当我使用普通表(没有 FTS3 创建的表)执行此操作时:

  • 下一个术语是在~3ms内获取,
  • 上一个术语是在~2ms内获取

为什么会有这么大的差异?有什么办法可以提高这个速度吗?

编辑:
我仍然无法让它工作!

4

2 回答 2

0

如果您开始运行LIMIT 1,则可以完全删除 order by 子句。这可能会有所帮助。但是,我对 FTS3 并不熟悉。

您也可以直接为您的 id 变量分配 ++ 或 -- 并断言 `WHERE _id = "+id+" LIMIT 1" 这将进行单个查找而不是 < 或 >。

编辑:现在我回顾一下我输入的内容,如果你这样做,你可以完全删除 LIMIT 1 ,因为你的 _id 是你的 pk 并且必须是唯一的。

嘿看,一个原始的 where 子句!

于 2011-06-20T15:31:53.143 回答
0

您创建的虚拟表旨在提供全文查询。它的目的不是在 where 条件下使用 PK 快速处理标准查询。在这种情况下,您的 _id 列上没有索引,因此 SQLite 可能会执行全表扫描。下一个问题是您的查询 - 它完全没有效率。尝试这样的事情(未经测试):

SELECT * FROM dictionary WHERE _id = (select max(_id) from dictionary where _id < ?)

您可以考虑的下一件事是重新设计您的应用程序。与其加载 1 行,不如说是 40 行,将它们加载到内存中,并在其中一个末端少于 n 时进行后台数据加载。即使持续 3 秒而不是 0.3 秒,长 SQL 操作也会对用户不可见

于 2011-06-24T09:46:53.593 回答