我应该在Realm中使用@Index吗?

7
我有最多600000个Realm对象在我的数据库中。我通过id(int)=,uuid =和time(int)< =进行查询,并按时间排序结果。我应该为一些字段使用@Index注释,或者将id从Integer更改为String吗?由于无法对时间字段建立索引并且不能拥有多字段索引,这些查询会变慢吗?Sqlite是否更适合我的需求?
此外,如果我一次将大量对象存储到数据库中,我应该为所有对象使用一个事务还是为每个对象创建一个新事务?大型事务会消耗多少内存,为每个对象创建新事务会影响性能吗?
该数据库将位于Android设备的外部存储器(存储卡)中。
2个回答

5

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

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


即使在布尔值上?这仍然会有所不同吗? - Anis LOUNIS aka AnixPasBesoin
是的,它可以加快查询速度。 - EpicPandaForce
我可以索引多个字段吗? - Aman Verma
1
啊,没错,你绝对可以在这两个字段上都加上 @Index。一个在 dateTime 上,另一个在 username 上。 - EpicPandaForce
我没有这样的变量。如何做到这一点?因此,它将类似于复制“transactionObject”,但使用小写字段。 - Aman Verma
显示剩余5条评论

4

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

关于事务,尽可能将尽可能多的操作放在一个事务内通常会更快,因为创建和提交事务有一定的开销,但是事务内的所有操作都必须适合内存。因此,根据数据集的大小,可能需要将其分成较小的批次。同样,制作一个小型概念验证可能是确定在您特定情况下最佳方案的最佳方法。


那么,我假设如果Realm不能使用索引,它会进行“全行扫描”吗?索引是真正的B树索引,您可以进行除等于查询之外的其他查询,还是只是哈希表?排序是如何实现的?结果集在查询后或在内存中排序? - Tapani
Realm是基于列的,因此在搜索单个列时非常快速。我们的索引是B+树,并且查询后的排序在内存中完成。 - Christian Melchior
这是否意味着即使我只访问结果集中的前两个对象,所有行都会被读入内存并排序? - Tapani
2
根据您所说的“读取到内存”的含义而定。Realm是一种具有零拷贝架构的内存映射数据库。当您进行查询时,我们会创建一个轻量级数据结构(称为行访问器),该数据结构指向实际数据,并对其进行排序,而不是对数据本身进行排序。这全部发生在c++中。没有数据被复制到Java中,只有在实际读取时才从c++中获取数据,例如,这就是为什么我们的集合如此轻巧的原因。 - Christian Melchior
@ChristianMelchior 如果我使用字段作为主键和索引,以及多个索引字段呢?这样做是否合适? - Aks4125

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接