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

Ios 如何在给定rowid列表的情况下快速查询SQLite?,ios,sql,sqlite,Ios,Sql,Sqlite,如何快速查询与行ID列表匹配的记录?我在iOS应用程序中有一个查询,如下所示: SELECT rowid, category_id FROM items WHERE rowid in (2, 4, 89, 4243, 44, 555, ...) rowid的列表可能有点长——几百个项目就是一个典型的例子 奇怪的是,这个查询需要几秒钟的时间来运行——在某些情况下长达12秒钟。无论是在SQLite shell中运行,还是在应用程序中运行,速度都很慢 但是,如果我将此查询替换为: SELECT ro

如何快速查询与行ID列表匹配的记录?我在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外壳上快速响应


这里发生了什么事
rowid
是主键,因此这应该是一个快速的索引查找。有没有更快的方法来运行这样的查询?我本以为是解析查询字符串起了作用,但分析显示几乎所有的时间都花在
sqlite3\u步骤上

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

请尝试将“where…In”替换为“where…between”或where…rowId>X和rowId
另一种解决方案是将可比较的行ID列表移动到临时表/视图中,并执行内部联接以更快地获得结果。

Hmmm,
中的行ID(…)
与其他解决方案相比应该具有相当好的性能。该查询之外是否有任何东西可能会减慢您的查询响应速度?
WHERE…IN
不能很好地处理大型列表,因为在内部,它将被视为大型OR列表,无法很好地进行优化。但是您可以尝试这种方法:@Martin我不这么认为,因为我在SQLite中看到了这个问题shell@AndreasOetjen所以,基本上,使用临时表?@比尔:是的,一些可以加入的东西。根据您的用例(可能您的id列表不会经常更改),持久化id表也可能是一个很好的解决方案。