使用未指定的索引.您的数据将被下载



使用未指定的索引。您的数据将在客户端上下载和筛选。考虑添加";。indexOn":"name"根据您的安全和Firebase数据库规则的作者,以获得更好的性能

这是什么意思?数据库有问题吗?

Query query = FirebaseDatabase.getInstance().getReference("authors").orderByChild("name").equalTo(str);
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot ds: dataSnapshot.getChildren()) {
search_authors author = ds.getValue(search_authors.class);
Log.println(Log.DEBUG, "Test", author.name);
}
}
@Override
public void onCancelled(DatabaseError error) {
// Failed to read value
throw  error.toException();
}
});

您看到的警告与客户端代码无关,而是您应该在服务器端进行的优化(在本例中,针对Firebase实时数据库(。

在您的代码中,您使用getReference("authors").orderByChild("name").equalTo(str),它表示";对于"/authors"下的所有数据,查找"name"等于给定字符串"的authors;。

当您的客户端SDK向服务器进行此查询时,它会在/authors下发送回所有内容(如果权限允许(,并说";嘿,我没有名字的索引,你能自己处理吗&";。然后,SDK会筛选发送回来的数据,并提取出所有"name"等于您给出的字符串的文档。它还显示您看到的警告。

在开发过程中,这很好,因为您处理的是少量数据,但当/authors开始包含数百个条目时,您最终会下载所有条目,而您可能只需要其中一个条目,这是低效的。在将代码部署到大众之前,您应该在Firebase控制台中将".indexOn": "name"添加到安全规则中,以构建此查询所需的索引。这里记录了如何做到这一点。

例如,您可以使用以下规则:

{
"rules": {
"authors": {
".read": "auth != null", // any logged in user can read anything under /authors
".indexOn": ["name"], // index all authors by the 'name' field

"$authorId": {
// only the owner can write to their own data
".write": "auth != null && auth.uid == $authorId", 
}
}
}
}

创建这样的索引后,服务器只能发回匹配的数据,而不能全部发回,并且警告将停止显示。然后对您计划查询的任何其他字段重复此操作,例如";likeCount"commentCount"createdAt"lastPostAt";,根据需要依此类推。

最新更新