objectbox / objectbox/objectbox-java

query use orderDesc is very slower than order

未关闭
#778 8 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

enhancement
主要语言
Java
星标
4.6k
派生
311
PR 合并指标
30 天内没有已合并 PR

描述

android 8.0 huawei P9
objectVersion:2.4.0

I inserted 12w pieces of data into Message table

@Entity
public class Message implements Serializable {

   @Id
    public long id;

    @Index
    private long serverId; 

    @Index
    private String sid;
    .......

}

the query method:

private void queryTest() {
       queryTest(1);
        queryTest(10);
        queryTest(50);
        queryTest(100);
        queryTest(1000);
        queryTest(3000);
        queryTest(6000);
        queryTest(10000);
}

private void queryTest(int queryNum) {
        long time = SystemClock.uptimeMillis();
        List<Message> messageList = Message.getMessageListByServerID2("k-007-liushengyun", Long.MIN_VALUE, queryNum);
        Log.d(TAG, "queryTest queryNum =" + queryNum + ",size=" + messageList.size() + ",orderTime=" + (SystemClock.uptimeMillis() - time));
        time = SystemClock.uptimeMillis();
        messageList = Message.getMessageListByServerID3("k-007-liushengyun", Long.MIN_VALUE, queryNum);
        Log.d(TAG, "queryTest queryNum =" + queryNum + ",size=" + messageList.size() + ",orderDescTime=" + (SystemClock.uptimeMillis() - time));
        messageList.clear();
    }

public static List<Message> getMessageListByServerID2(String sid, long minServerID, int count) {
        try {
            Query<Message> query = StoreManager.getBoxStore().boxFor(Message.class).query()
                    .equal(Message_.sid, sid)
                    .greater(Message_.serverId, minServerID).or().equal(Message_.serverId, minServerID)
                    .order(Message_.serverId).build();
            return count > 0 ? query.find(0, count) : query.find();
        } catch (Exception e) {
            SogouPlus.onException(e);
            return new LinkedList<>();
        }
    }

public static List<Message> getMessageListByServerID3(String sid, long minServerID, int count) {
        try {
            Query<Message> query = StoreManager.getBoxStore().boxFor(Message.class).query()
                    .equal(Message_.sid, sid)
                    .greater(Message_.serverId, minServerID).or().equal(Message_.serverId, minServerID)
                    .orderDesc(Message_.serverId).build();
            return count > 0 ? query.find(0, count) : query.find();
        } catch (Exception e) {
            SogouPlus.onException(e);
            return new LinkedList<>();
        }
    }

the query result:(ms)

queryTest queryNum =1,size=1,orderTime=71
queryTest queryNum =1,size=1,orderDescTime=301
queryTest queryNum =10,size=10,orderTime=72
queryTest queryNum =10,size=10,orderDescTime=581
queryTest queryNum =50,size=50,orderTime=73
queryTest queryNum =50,size=50,orderDescTime=908
queryTest queryNum =100,size=100,orderTime=75
queryTest queryNum =100,size=100,orderDescTime=1079
queryTest queryNum =1000,size=1000,orderTime=114
queryTest queryNum =1000,size=1000,orderDescTime=1952
queryTest queryNum =3000,size=3000,orderTime=175
queryTest queryNum =3000,size=3000,orderDescTime=2504
queryTest queryNum =6000,size=6000,orderTime=293
queryTest queryNum =6000,size=6000,orderDescTime=2846
queryTest queryNum =10000,size=10000,orderTime=483
queryTest queryNum =10000,size=10000,orderDescTime=3123

贡献指南

这个仓库没有索引到贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

调研方向

从报告中的 getMessageListByServerID2 和 getMessageListByServerID3 方法开始,然后使用包含 120,000 行的 Message 数据集在 Android 8.0 上重现 queryTest。比较 order 和 orderDesc 的耗时与结果;当降序查询行为得到解释或修正,并由回归检查覆盖时,即表示完成。

由索引模型根据 Issue 内容生成。

评估

技术栈
android, java
领域
database, mobile
Issue 类型
缺陷
难度
4/5
预计耗时
3-5 天
活跃度
停滞
描述清晰度
基本清楚
新手友好度
25/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。