如何快速查询与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
上。
答案 0 :(得分:-1)
带有where子句的SQL查询总是比带有where的查询更快。您提到RowID是表中的主键(因此,默认情况下创建了它的集群索引)。
请尝试将'where ... In'替换为'where ... between'或where ... rowId> X和RowId
其他解决方案是将可比较的行ID列表移动到临时表/视图,并执行内部联接以更快地获得结果。