objectbox / objectbox/objectbox-java
query use orderDesc is very slower than order
未关闭
还没有人认领这个 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
贡献指南
这个仓库没有索引到贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 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