如何在核心数据中有效地插入和获取UUID



我正在寻找一种在核心数据中存储和搜索UUID的有效方法。这些 UUID 由分布式系统中的许多 iOS 设备生成。这些设备中的每一个都可以存储大约 20-50k UUID。

很明显,将UUID存储为核心数据中的字符串会损害索引的效率。但经过一系列研究,我发现将UUID作为二进制数据存储在核心数据中(并对其进行索引)可能不如将其存储为字符串的效率。

由于SQL中没有类似二进制或类似VABINARY的数据类型,因此支持它。我猜核心数据中的任何二进制数据类型都存储在SQLit中作为BLOB。由于 BLOB 可能是索引速度最慢的数据类型,因此会对性能造成不良影响。

那么任何人都可以帮助回答,有没有更有效的方法在核心数据中存储UUID?

将它们

存储为 ASCII 字符串,并使该字段成为索引。

编辑

埃加德,我碰巧在做一些戳,遇到了这个。 多么可耻的答案。 那天我一定有点心情。 如果可以的话,我会删除它并继续前进。 但是,这是不可能的,所以我将提供一个更新的截图。

首先,知道什么是"高效"的唯一方法是测量,考虑程序时间和空间以及源代码复杂性和程序员的努力。

幸运的是,这个很容易。

我写了一个非常简单的OSX应用程序。 该模型由单个属性组成:identifier

如果您不将属性标记为索引,则这些都不重要。 创建商店时将花费更多时间,但它会使查询速度更快。

另请注意,为二进制属性创建谓词与为字符串创建谓词完全相同:

fetchRequest.predicate =
    [NSPredicate predicateWithFormat:@"identifier == %@", identifier];

该应用程序非常简单。 首先,它创建 N 个对象,并将 UUID 分配给标识符属性。 它每 500 个对象节省 MOC。 然后,我们将所有标识符存储到一个数组中并随机洗牌。 然后完全拆除整个 CD 堆栈以将其全部从内存中删除。

接下来,我们再次构建堆栈,然后迭代标识符,并进行简单的获取。 fetch 对象是构造的,使用一个简单的谓词来获取该对象。 所有这些都是在自动发布池中完成的,以保持每次获取尽可能原始(我承认会与 CD 缓存进行一些交互)。 这并不重要,因为我们只是比较不同的技术。

二进制标识符是 UUID 的 16 个字节。

UUID 字符串是一个 36 字节的字符串,是调用 [uuid UUIDString] 的结果,它看起来像这样 (B85E91F3-4A0A-4ABB-A049-83B2A8E6085E)。

Base64 String 是一个 24 字节的字符串,是 base-64 对 16 字节 UUID 二进制数据进行编码的结果,对于相同的 UUID,它看起来像这样 (uF6R80oKSrugSYOyqOYIXg==)。

计数是该运行的对象数。

SQLite 大小是实际 sqlite 文件的大小。

WAL 大小是 WAL(预写日志记录)文件的大小 - 仅供参考...

创建

是创建数据库的秒数,包括保存。

查询

是查询每个对象的秒数。

<样式>计数 (N)
数据类型

最新更新