2011-06-20 16 views
1


我有一个sqlite数据库,目前有几个表中最大的一个拥有超过10,000行。此表有四列:id,术语,定义,类别。我使用了FTS3模块来加速搜索,这对我们有很大的帮助。但是,现在当我尝试从表中获取'下一个'或'上一个'行时,它比我在开始使用FTS3之前花费的时间更长。Android:当读取下一个/上一个行时SQLite 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的

为什么会出现是一个很大的区别?有什么办法可以提高这个速度吗?

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

回答

0

您创建的虚拟表格旨在提供全文查询,它并不旨在使用PK快速处理标准查询,其中cond银行足球比赛。 在这种情况下,_id列没有索引,所以SQLite可能会执行全表扫描。 下一个问题是你的查询 - 这是完全没有效率的。试试类似的东西(未经测试):

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

接下来你可以考虑重新设计你的应用。不要加载1行,也许你应该让我们说40,将它们加载到内存中,并在其中一个末端少于n时加载背景数据。长时间的SQL操作对于用户来说将变得不可见,即使它将持续3秒而不是0.3秒

0

如果您首先运行LIMIT 1,则可以完全删除order by子句。这可能有帮助。然而,我不熟悉FTS3。

你也只是平了分配您的ID变量++或 - 和断言'WHERE _id =“+编号+” LIMIT 1" ,这将使得单一的查询,而不是<或>

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

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

+0

感谢您的回应。我已经尝试了你所说的(首先减少/增加id,然后通过它获取数据),并且有改进,但是如果我将添加过滤器(如果我想获取属于特定类别的术语),它将不起作用。我也发现用FTS3'WHERE _id MATCH'10''比'WHERE _id = 10'快很多。 – Marqs

相关问题