如何在给定rowid列表的情况下快速查询SQLite?

时间:2018-06-13 10:26:24

标签: ios sql sqlite

如何快速查询与rowid列表匹配的记录?我的iOS应用中有一个查询,如下所示:

SELECT rowid, category_id
FROM items
WHERE rowid in (2, 4, 89, 4243, 44, 555, ...)

rowid列表可能有点长 - 几百个项目就是一个典型的例子。

奇怪的是这个查询需要几秒钟才能运行 - 在某些情况下多达12秒。无论我是在SQLite shell中运行它还是在我的应用程序中运行它都很慢。

但是,如果我用以下代码替换此查询:

SELECT rowid, category_id
FROM items

所以我检索表中的每个项目(在我的测试用例中,大约1000行),让我的应用程序忽略它不需要的rowid,查询只在几百毫秒内执行。它也在SQLite shell上快速响应。

这里发生了什么? rowid是主键,因此这应该是一个快速的索引查找。有没有更快的方式来运行这样的查询?我原以为它解析的查询字符串会产生差异,但是分析显示几乎所有的时间花在了sqlite3_step上。

1 个答案:

答案 0 :(得分:-1)

带有where子句的SQL查询总是比带有where的查询更快。您提到RowID是表中的主键(因此,默认情况下创建了它的集群索引)。

请尝试将'where ... In'替换为'where ... between'或where ... rowId> X和RowId

其他解决方案是将可比较的行ID列表移动到临时表/视图,并执行内部联接以更快地获得结果。