Google app engine GAE/Go:数据存储迭代器太慢

Google app engine GAE/Go:数据存储迭代器太慢,google-app-engine,go,google-cloud-datastore,Google App Engine,Go,Google Cloud Datastore,GAE/Go中对数据存储查询结果的迭代非常缓慢 q := datastore.NewQuery("MyStruct") gaeLog.Infof(ctx, "run") // (1) it := client.Run(ctx, q) list := make([]MyStruct, 0, 10000) gaeLog.Infof(ctx, "start mapping")

GAE/Go中对数据存储查询结果的迭代非常缓慢

q := datastore.NewQuery("MyStruct")
gaeLog.Infof(ctx, "run")                                                 // (1)
it := client.Run(ctx, q)
list := make([]MyStruct, 0, 10000)
gaeLog.Infof(ctx, "start mapping")                                       // (2)
for {
    var m MyStruct
    _, err := it.Next(&m)
    if err == iterator.Done {
        break
    }
    if err != nil {
        gaeLog.Errorf(ctx, "datastore read error : %s ", err.Error())
        <some error handling>
        break
    }
    list = append(list , m)
}
gaeLog.Infof(ctx, "end mapping. count : %d", len(list))                  // (3)
(2)
(3)
之间大约需要4.5秒,只有2400条记录。它非常慢

q := datastore.NewQuery("MyStruct")
gaeLog.Infof(ctx, "run")                                                 // (1)
it := client.Run(ctx, q)
list := make([]MyStruct, 0, 10000)
gaeLog.Infof(ctx, "start mapping")                                       // (2)
for {
    var m MyStruct
    _, err := it.Next(&m)
    if err == iterator.Done {
        break
    }
    if err != nil {
        gaeLog.Errorf(ctx, "datastore read error : %s ", err.Error())
        <some error handling>
        break
    }
    list = append(list , m)
}
gaeLog.Infof(ctx, "end mapping. count : %d", len(list))                  // (3)
如何提高性能

[更新]

我在上面的代码
q:=datastore.NewQuery(“MyStruct”)
中添加了查询。
我试图检索种类
MyStruct
中的所有实体。这种类型有2400个实体。

我使用的是
cloud.google.com/go/datastore
,发现速度很慢。我迁移到使用
google.golang.org/appengine/datastore

结果如下,不到1秒

13:57:46.216 run
13:57:46.367 start mapping
13:57:47.063 end mapping. count : 2400

很难如实回答这个问题。数据库查询的速度取决于数据库的索引和查询的细节。这些细节都没有出现在问题中。@PaulHankin where花费的时间介于(2)和(3)之间,即在client.Run完成之后。我想你是说4.5s不能成为数据库,因为你认为
client.Run
一次完成了数据库中的所有查找。这可能是错误的——取决于您的索引和查询,
it.Next()
可能会执行更多的数据库查找。@PaulHankin我明白了,我当然认为所有的查找都将由
客户端完成。运行
。我已经更新了我的帖子,添加了查询细节和数据存储类型。我唯一想到的是,您可能应该将列表更改为
[]*MyStruct
,并将
var m*MyStruct
。我相信
append
正在复制结构,因为您是按值传递它的。