【问题标题】:Should I use @Index with Realm?我应该在领域中使用@Index 吗?
【发布时间】:2016-09-22 04:18:38
【问题描述】:

我有最大值。我的数据库中有 600000 个领域对象。我通过 id(int)=、uuid= 和 time(int)

另外,如果我一次将大量对象存储到数据库中,我应该为所有对象使用一个事务还是为每个对象创建一个新事务?大型事务会消耗多少内存,为每个对象创建新事务时是否会影响性能?

数据库将在 Android 设备的外部存储(存储卡)中。

【问题讨论】:

    标签: android realm


    【解决方案1】:

    您绝对应该在任何查询中使用的任何字段上使用@Index

    大大提高了性能/查询速度。

    【讨论】:

    • 即使是布尔值?它还会有所作为吗?
    • 是的,它使查询速度更快
    • 我可以索引多个字段吗?
    • 您可以将索引放在 1 个字段上,但很遗憾,您不能有复合索引(2 个字段的 1 个索引)。
    • 啊,是的,您绝对可以在两个字段上添加@Index。一个在dateTime,一个在username
    【解决方案2】:

    来自Realm的Christian。关于@Index,我们很快也会为整数添加它。如果您担心速度,我可能会对不同的选项进行基准测试,看看哪种方法更适合您,因为在一般情况下回答这些问题非常困难。

    关于事务,在一个事务中尽可能多地进行批处理通常更快,因为创建和提交事务会产生开销,但事务中的所有内容都必须适合内存。因此,根据数据集的大小,可能必须将其分成更小的批次。再次进行小型概念验证可能是查看在您的特定情况下最有效的最佳方法。

    【讨论】:

    • 所以,我假设如果 Realm 不能使用索引,它会进行“全行扫描”?除了等于查询或哈希表之外,您还可以在其中创建真正的 B 树索引吗?排序是如何实现的?结果集是在查询之后还是在进行查询时在内存中排序的?
    • Realm 是基于列的,因此搜索单个列实际上非常快。我们的索引是 b+trees,查询后在内存中进行排序。
    • 这是否意味着即使我只访问结果集中的前两个对象,所有行也会被读取到内存并排序?
    • 取决于你的意思是读到内存? Realm 是具有零拷贝架构的内存映射数据库。当您进行查询时,我们会创建一个指向真实数据的轻量级数据结构(称为行访问器),这就是被排序的内容,而不是数据本身。这一切都发生在 c++ 中。没有数据被复制到 Java,它只在实际读取时从 c++ 中获取,例如。这就是我们的系列如此轻巧的原因。
    • @ChristianMelchior 如果我使用字段作为主键和索引怎么办?和多个索引字段?使用合适吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2014-01-30
    • 2011-05-30
    • 2023-03-26
    • 1970-01-01
    • 2021-06-29
    相关资源
    最近更新 更多