我有一个App应用程序,它使用go115运行时,通过google.golang.org/appengine/v2/datastore包与Cloud交互。该应用程序使用自动分配的整数ID和一个Song字段(以及其他字段)插入和查询Rating实体:
type Song struct {
// ...
Rating float64 `json:"rating"`
// ...
}对于19,900个Song实体,https://console.cloud.google.com/datastore/stats报告的数据大小为15.53MB,内置索引大小为102.27 MB,复合索引大小为86.31MB。该应用程序在us-central中运行,Datastore在nam5 (us-central)中运行。
在从App运行时,以下仅键查询通常需要2-4秒才能返回13,571个键:
q := datastore.NewQuery("Song").KeysOnly().Filter("Rating >=", 0.75)
keys, err := q.GetAll(ctx, nil)使用Run代替GetAll并在迭代时收集ID似乎要快一点点。我还尝试使用笔记本电脑上的cloud.google.com/go/datastore包,以确保旧的appengine包不是特别慢,但结果要糟糕得多(7-9秒)。
我的理解(基于索引文件和I/O 2010“下一代查询”谈话)是,Datastore自动维护Rating字段的索引。我希望使用该索引来满足这个查询是非常简单的。结果集中的整数ID看起来应该占用大约100 KB的空间。
我还没有从Google那里找到任何关于Datastore所期望的性能类型的官方指导,但这比我所期望的要慢得多。当我对数据的JSON转储运行jq工具和grep,在我的笔记本电脑上执行这个查询的强力近似时,它只需要400 ms。
是否期望一个简单的数据存储查询需要多秒钟时间才能返回数千个键?
当我运行只返回较小结果集的键查询时,性能会更好:返回300-400键的查询通常需要100-200 ms,而返回少于200个键的查询则在40-70 ms内完成。
我无法修改我的许多查询来限制它们返回的结果的数量:
我可以想到在某些情况下可能有所帮助的黑客(例如,对我的实体进行切分/分区,以便并行运行多个查询),但如果可能的话,我更愿意避免这种情况。
发布于 2022-02-01 12:21:03
我想说,在2-4秒内返回13,571个键的仅键查询是相当快的。毕竟,这仍然是一个查询。
如果可能的查询总数不是很大,那么您可以预先存储查询结果吗?
https://stackoverflow.com/questions/70931633
复制相似问题