iphone - sqlite 在 ios 设备上获取速度慢但在模拟器上速度快

标签 iphone ios performance sqlite

我有一个包含 3 个表的数据库,每个表有 700000 条记录。我在使用查询的应用程序中添加了搜索功能...

const char *sqlstatement="select * from artist where name like ?";
        sqlite3_stmt *compliedstatement;
        if(sqlite3_prepare_v2(database,sqlstatement , -1, &compliedstatement, NULL)==SQLITE_OK)
        {
            sqlite3_bind_text(compliedstatement,1,[[NSString stringWithFormat:@"%%%@%%",self.searchBar.text] UTF8String], -1, SQLITE_STATIC);

这在模拟器上没问题,但在 iOS 设备上花了大约一分钟。所以我使用 Sqlite Manager 向表列添加索引,数据库大小从 76mb 增加到 166mb,但现在这个查询在模拟器上运行大约需要 1 到 2 秒,在设备上大约需要 10 到 15 秒。所以它是一个改进,但还有进一步改进它的建议吗?不,我现在不能使用 CoreData。

最佳答案

首先要注意的是,SQLite 不会为 LIKE 子句使用索引,即使它们的形式是 LIKE '...%'(例如 LIKE 'Fred%'),关键是大多数排序规则序列区分大小写。您观察到的性能改进是由于 SQLite 使用了所谓的索引搜索 - 它可以搜索索引,而不必遍历整个表。

700,000 条记录的 15 秒还不错,实际上它是关于我自己得到的,对于一个非常相似的查询。要对此进行任何改进,您必须考虑进行全文搜索 (FTS)。这比简单地添加索引涉及更多的工作,但它可能是适合您的方法。

如果他们查询返回大量行,而您正在使用这些行来填充 TableView ,则可能由于必须处理如此多的行而导致另一个性能问题,即使您只是提取行 ID。我的解决方案是将获取的行数限制在 5,000 行左右,因为没有人愿意滚动超过该行数。

关于iphone - sqlite 在 ios 设备上获取速度慢但在模拟器上速度快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9495493/

相关文章:

iphone - UITableViewController 按单元格标识符编辑

iphone - 过滤 Apple 推送通知

ios - Storyboard 登录屏幕的最佳实践,在注销时处理数据清除

mysql - 为什么并行执行查询时MySQL的性能会下降?

java - 将 Hibernate 工具移动到构建时间

javascript - 如何获取时间在 Mongodb 中检索数据

iphone - 检测在视野之外开始的触摸

iphone - IOS 从 MS Word 中读取文本

ios - 如何在 Swift 中的滑出菜单的主 UIView 后面添加 UIView?

ios - UIBarButtonItem(自定义 View :) -- not tappable