Xcode Core-Data数据模型检查器中的索引是什么?
在Xcode中,您可以为数据模型检查器中的实体添加“索引”。
对于屏幕截图,我做了两次“添加”,所以“逗号,分隔,属性”只是默认值。
这些索引究竟是什么?
他们与索引属性有什么关系吗? 如果他们在指定这个检查员的索引和select“索引”的个人属性之间有什么区别?
优化核心数据search和sorting
正如标题所说,索引是加快search和sorting你的数据库。 但是,它会减缓对持久存储的更改 。 在查询中使用NSPredicates
和NSSortDescriptor
对象时,这很重要。
假设您有两个实体: PBOUser
和PBOLocation
(多对多) 。 您可以在下面的图片中看到它的属性:
假设在数据库中有10000个用户和50000个位置。 现在我们需要find每个用户的电子邮件开始。 如果我们提供这样的查询而没有索引,核心数据必须检查每个logging(基本上是10000) 。
但是,如果它是索引(换句话说,通过电子邮件降序sorting)呢? – >然后CoreData只检查那些以a
开头的logging。 如果核心数据到达b
然后停止search,因为显然没有更多的电子邮件从索引开始。
怎么做?
要么:
希望他们是相同的:-)
但是,如果您希望:以a
开头的电子邮件和名称以b
开始您可以执行此操作检查INDEXED是否为PBOUser
实体的name
属性,或者:
这是你如何优化你的数据库:-)
使用索引列表将复合索引添加到实体。 复合索引是跨越多个属性或关系的索引。 复合索引可以使search更快。 数据模型中的属性和关系的名称是最常见的索引。 您必须使用SQLite存储来使用复合索引。
将具有单个属性的行添加到Indexes
列表等效于为该属性selectIndexed
:它为该属性创build索引以加快查询语句中的search。
Indexes
列表适用于复合索引 。 当您知道要在查询的WHERE
子句中search这些属性的值时,复合索引非常有用:
SELECT * FROM customer WHERE surname = "Doe" AND firstname = "Joe";
这个声明可以使用复合索引surname, firstname
。 如果你只是searchsurname
,那么索引也是有用的,但如果你只searchfirstname
,那么这个索引也是有用的。 将索引想象成电话簿:首先按姓氏sorting,然后按名字sorting。 所以属性的顺序很重要。