python - 用于计数查询的 Google Cloud Datastore 索引

标签 python google-cloud-datastore app-engine-ndb

Google 云数据存储要求需要构建复合索引来查询一种类型的多个字段。以下面的查询为例,

class Greeting(ndb.Model):
    user = ndb.StringProperty()
    place = ndb.StringProperty()

# Query 1
Greeting.query(Greeting.user == 'yash@gmail.com', Greeting.place == 'London').fetch()
# Query 2
Greeting.query(Greeting.user == 'yash@gmail.com', Greeting.place == 'London').count()

我正在使用 python 和 ndb 来访问云数据存储。在上面的示例中,如果 userplace 上没有定义复合索引,查询 1 会引发 NeedIndexError。但即使 userplace 上没有索引,查询 2 也能正常工作。

我想了解当云数据存储强制使用​​索引来获取实体列表(查询 1)时,它如何在没有索引的情况下获取计数(查询 2)。据我所知,它存储每个索引的每种统计信息,这将导致对现有索引计数的更快响应(请参阅 docs )。但我无法解释上述行为。

注意:查询给定类型的一个属性时不会出现问题,因为默认情况下云数据存储对单个属性有索引。

最佳答案

对于为什么会发生这种情况,没有明确和直接的解释,但很可能是因为改进的查询规划器如何与 zigzag 索引配合使用。

您可以在这里阅读更多相关信息:https://cloud.google.com/appengine/articles/indexselection#Improved_Query_Planner

count() 工作和 fetch() 背后的逻辑可能不会,因为使用 count() 你不需要保留内存中有很多结果。

因此,在 count() 的情况下,您可以通过将工作拆分为并行处理的多个 block ,然后将相应的计数求和为一个来轻松扩展。你不能用游标/记录集廉价地做到这一点。

关于python - 用于计数查询的 Google Cloud Datastore 索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51555774/

相关文章:

python - Tensorflow 对象检测中的输入张量与 Python 签名不兼容

google-app-engine - 在 Google App Engine for Go 中,一个属性如何具有多种类型的值?

python - 在gae ndb中,是否有类似于关系数据库中的级联删除的功能?

python - GAE Python NDB .put 在开发上不同步(但在生产中有效)?

python - 如何在 Python 中查找线程的运行时间

python - USPS Package Track API 不返回 TrackSummary 的 XML 子元素

python - 如何有效地将 Pandas Dataframe 保存到一个/多个 TFRecord 文件中?

google-app-engine - 在 datastore.Query.Run(c).Next(x) 上出现奇怪的错误

python - Bigtable 还是 Datastore 更适合在线应用程序存储和使用财务数据?

python - 与 Google App Engine 上的 NDB 的多对多关系