栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

分页与批处理查询?是否可以从数据存储中批处理获取并获取游标?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

分页与批处理查询?是否可以从数据存储中批处理获取并获取游标?

您的方法非常好,实际上,这是AppEngine上的最佳方法。

如果插入了一条新记录(例如第一个记录),则通过设置开始光标来查询后续实体不会给您重复的结果。

为什么?因为游标包含 编码 的最后一个返回实体的键 ,而不是先前返回的实体的数量。

因此,如果您设置游标,则数据存储区将开始列出并返回游标中编码的键之后的实体。如果保存了光标之后的新实体,则到达该实体时将返回该实体。

也使用

for
append()
是最好的方法。您可以通过预先创建足够大的切片来对其进行一些优化:

var is = make([]Item, 0, limit)

但是请注意,我故意这样做是出于

0
长度和
limit
容量的考虑:不能保证会有足够的实体来填充整个切片。

另一个优化是将其分配为

limit
length:

var is = make([]Item, limit)

并在

datastore.Done
到达时将其重新分配(如果未完全填充),例如:

for idx := 0; ; idx++ {    var i Item    _, err := t.Next(&i)    if err == datastore.Done {        if idx < len(is) { is = is[:idx] // Reslice as it is not filled fully        }        break    }    is[idx] = i}

批量操作

GetMulti
PutMulti
并且
DeleteMulti
是的批量版本
Get
Put
Delete
功能。它们采用
[]*Key
而不是
*Key
,并且
appengine.MultiError
在遇到部分故障时可能会返回。

批处理操作不是查询的替代或替代。

GetMulti
例如,要求您已经准备好要获取完整实体的所有键。因此,这些批处理操作没有任何游标意义。

批处理操作将返回所有请求的信息(或执行所有请求的操作)。没有实体/操作的序列会/可能会终止并且以后会继续。

查询和批处理操作是针对不同的事物的。您不必担心查询和游标的性能。它们做得很好,而且重要的是,它们(数据存储区)可扩展。游标不会降低查询的执行速度,带游标的查询的运行速度与没有游标的查询一样快,并且先前返回的实体也不会影响查询的执行时间:是否运行查询都没有关系没有游标或拥有一百万个实体后获得的游标(只能通过多次迭代获得)。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/370535.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号