我有一个包含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。
答案 0 :(得分:1)
要注意的第一点是SQLite不会使用LIKE子句的索引,即使它们的形式为LIKE'...%'(例如LIKE'Fred%'),关键是大多数归类序列区分大小写。您观察到的性能改进是由于SQLite使用所谓的索引搜索 - 它可以搜索索引而不必遍历整个表。
对于700,000条记录来说,15秒也不错,事实上它是关于我自己得到的,对于一个非常相似的查询。要对此进行任何改进,您必须考虑进行全文搜索(FTS)。这比简单地添加索引要多得多,但它可能是你的选择。如果他们查询返回了很多行,并且您正在使用这些行来填充表视图,那么由于必须处理这么多行,可能会出现另一个性能问题,即使您只是删除了行ID。我的解决方案是将获取的行数限制为大约5,000,理由是没有人想要滚动更多。
答案 1 :(得分:1)
使用SQLite的FTS功能。默认情况下启用FTS并使用“like”解决查询性能问题。您需要将alle行添加到FTS虚拟表中。然后使用“匹配”而不是“喜欢”。请参阅此处的文档:http://www.sqlite.org/fts3.html。您可以期望性能以毫秒而不是秒为单位。