Xcode Core-Data数据模型检查器中的索引是什么?

在Xcode中,您可以为数据模型检查器中的实体添加“索引”。

显示索引视图的Xcode侧边栏

对于屏幕截图,我做了两次“添加”,所以“逗号,分隔,属性”只是默认值。

这些索引究竟是什么?
他们与索引属性有什么关系吗? 如果他们在指定这个检查员的索引和select“索引”的个人属性之间有什么区别?

优化核心数据search和sorting

正如标题所说,索引是加快search和sorting你的数据库。 但是,它会减缓对持久存储的更改 。 在查询中使用NSPredicatesNSSortDescriptor对象时,这很重要。

假设您有两个实体: PBOUserPBOLocation (多对多) 。 您可以在下面的图片中看到它的属性:

在这里输入图像说明

假设在数据库中有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。 所以属性的顺序很重要。