我在iPad上运行了一个Core Data数据库。它有30,000个联系人,其中包含名字,姓氏等属性。
使用NSCompoundPredicate,搜索性能不佳。我或者是两个LIKE Predicates(在名字和姓氏上),它需要大约1500毫秒来搜索30,000个联系人。然后我尝试将'indexed'属性添加到firstname和lastname字段(使用XCode Data Modeller UI),但性能似乎完全相同。
由于将Indexed属性添加到两个字段,我已从数据库中删除了所有对象并重新填充它。我是否需要做更多的事情才能开始使用索引,我是否希望通过索引复合谓词中使用的两个字段来提高性能?
我在真实设备(iPad3)上运行。搜索30,000个联系人记录的1500毫秒似乎并不那么好 - 它是否适用于该课程?
非常感谢。
答案 0 :(得分:8)
LIKE
搜索费用很高,无论您搜索的属性是否已被编入索引。
许多应用程序 - 包括Apple自己的应用程序 - 通过以用户不会注意到的方式限制搜索来避免此问题。例如,在类似于“联系人”的应用程序中进行搜索时,实际上并不希望将查询与人名的所有可能子字符串相匹配;相反,它匹配名字以查询开头的名字。
为了进一步优化,还要考虑一下,如果LIKE
和BEGINSWITH
找不到完全符合Unicode的,大小写和变音符号的匹配,您可能会离开。 Apple的DerivedProperty示例显示了如何通过存储搜索属性的“规范化”(即所有相同的情况,没有变音符号,其他无关的东西)版本并使用依赖于词典排序的谓词来获得更好的性能(例如normalizedLastName >= "foo" && normalizedLastName < "fop"
)。
有关这些及相关技巧的更多详细信息,请参阅过去WWDC的一些核心数据会话,尤其是2010 Session 137, "Optimizing Core Data Performance on iPhone OS"。