我有这张桌子:
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查询?
答案 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)
,并且当人们这样做时,预计会很慢。