android - Firebase 实时数据库快速删除大查询结果
问题描述
我的实时数据库已经存储了超过 1GB 的数据,所以为了修剪它、节省存储空间和优化日常使用,我每月运行一次例程来删除旧的和不相关的数据。
它是这样的:
App.getDatabaseInstance().getReference("store/orders/historic/").orderByChild("creationTs").limitToLast(500).endAt(System.currentTimeMillis() - (90L * ONE_DAY_MILLIS)).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.hasChildren()) {
for (DataSnapshot historicDs : dataSnapshot.getChildren()) {
historicDs.getRef().removeValue();
}
cleanHistoricBranch();
} else
System.out.println("FINISHED!!!");
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
该查询在数据库中的数千个节点(不是数百万个)上运行,但需要 HOURS 才能完成。我想问题是必须一个接一个地下载和删除数据
我尝试了不同的方法,但效果不佳。
App.getDatabaseInstance().getReference("store/orders/historic/").orderByChild("creationTs").limitToLast(500).endAt(System.currentTimeMillis() - (90L * ONE_DAY_MILLIS)).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.hasChildren()) {
dataSnapshot.getRef().removeValue(); //deletes the whole branch, even the nodes that doesnt match the query.
cleanHistoricBranch();
} else
System.out.println("FINISHED!!!");
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
那么有没有人有更好的方法来修剪数据库层次结构中的大量节点?每个节点的数据很少,但我有大约 20 到 5 万个候选节点要删除。
解决方案
如果时间主要花在读取数据上,常见的做法是:
- 更频繁地运行该过程,这样您每次必须做的数据更少。
- 设置数据库的集成备份,并使用该备份来确定要脱机删除的密钥。然后将写操作发送到在线数据库。
推荐阅读
- c# - C#用鼠标动态移动Picturebox类
- sql - 从显示的行中查询记录数
- node.js - 如何从 dynamoDB 的 LIST 中删除元素
- spring - Redis @Reference 在 Spring Data Redis 中不起作用
- rest - 如何使http请求中的搜索参数在jmeter中成为动态的
- cassandra-3.0 - 所有 I/O 线程上的所有连接都忙
- oracle - ora_12700的解决方案
- ios - 如何在导航栏后面显示图像?
- apache-kafka - kafka_2.11-0.9.0.1 与 Zookeeper 3.4.12 兼容吗?
- mysql - 多对多左连接,其中根据最小日期差异连接行