Realm.io - 如何优化findAll查询?

时间:2015-07-18 11:38:08

标签: android realm

我有这张桌子:

public class Meaning extends RealmObject {

    @Index
    private String key;
    private String value;
    private byte[] entries;

    //getters & setters
}

它包含超过400K的对象。 我正在列出这样的意思:

RealmQuery<Meaning> query = realm.where(Meaning.class);
query.beginsWith("key", word);
RealmResults<Meaning> meaningList = query.findAll();
meaningList.sort("key", true);
return meaningList;

结果如下所示:

r:6593ms
re:3459ms
rea:3416ms
real:3137ms
realm:3237ms
real:3298ms
rea:3084ms
re:712ms
r:289ms
:6539ms

对于增量搜索,此结果不佳。所以我的问题是如何优化findAll查询?

3 个答案:

答案 0 :(得分:0)

当我创建对象时,我认为通过将@Index放在上可以使该列编入索引。至少,奇怪的是它不会自动排序对象。也许我深深地不了解Realm。经过几个小时的尝试错误,我发现,当你插入单词时,他们应该已经排序了。

提示1: 我将所有含义插入到SQLite表中,然后以排序方式选择它们以便插入到Realm中。现在结果是这样的

#<mobile: "917572077896">

提示2: 在查询中关闭区分大小写。 False是布尔值,用于关闭区分大小写的搜索。通过这样做,我将第一个字符的搜索改进为100毫秒。

r:351ms (18 times faster)
re:185ms
rea:95ms
rea:56ms
real:88ms
real:58ms
realm:83ms (39 times faster)
real:107ms
rea:110ms
rea:76ms
re:177ms
re:161ms
r:305ms
:5154ms (1.26 times faster)

答案 1 :(得分:0)

有趣的用例!我不知道您的数据集,所以我无法建议最佳策略,但我可以为您提供一些想法。

我的建议是将findAll()sort()的时间分开,以查看哪一个在不同条件下最慢。在那之后,我将通过按字母顺序和长度排序您的数据进行实验,一次尝试一个,或者两者以不同的顺序排序。

此外,关于索引,目前只有equalTo()充分利用索引,而beginsWith()仍然落后一点(但我们正在努力使其快速!)。< / p>

我希望这有帮助!

答案 2 :(得分:0)

您应该使用en代替findAllSorted()findAll()

另外,请确保直接访问结果(sort()),而不是将其映射到某处。我已经看到人们将整个数据库删除到results.get(i),并且当人们这样做时,预计会很慢。