我有一个数据库,其中有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使用了所谓的索引搜索-它可以搜索索引,而不必遍历整个表。

15秒钟记录700,000条记录还不错,实际上,这是我得到的一个类似查询的结果。要对此进行任何改进,您必须考虑进行全文搜索(FTS)。这不仅仅是简单地添加索引,还需要做更多的工作,但这可能是适合您的方法。

如果他们的查询返回很多行,而您正在使用这些行来填充表视图,则可能由于要处理这么多行而导致另一个性能问题,即使您只是提取行ID。我的解决方案是将获取的行数限制为5,000,因为没有人愿意滚动浏览更多的行。

08-27 19:35
查看更多