Python datetime属性和父项的NDB索引

Python datetime属性和父项的NDB索引,python,google-app-engine,google-cloud-datastore,Python,Google App Engine,Google Cloud Datastore,我对自己对索引的理解并不完全自信。 舒适度:87% 亲子关系是否会影响BigTable平板电脑上的索引位置。还是纯粹由种类决定 我的例子是: 通常,如果实体类型受到频繁写入的影响,那么为datetime属性编制索引是个坏主意 但是,如果父项是一个均匀分布的随机键,并且不太可能有两个这样的实体具有相同的父项,那么我还会有一个单调递增的索引值创建热点的问题吗 我使用的是应用程序引擎标准,Python2.7 " …我有一个这样的实体: class Proposed(ndb.Model): fo

我对自己对索引的理解并不完全自信。 舒适度:87%

亲子关系是否会影响BigTable平板电脑上的索引位置。还是纯粹由种类决定

我的例子是:

通常,如果实体类型受到频繁写入的影响,那么为datetime属性编制索引是个坏主意

但是,如果父项是一个均匀分布的随机键,并且不太可能有两个这样的实体具有相同的父项,那么我还会有一个单调递增的索引值创建热点的问题吗

我使用的是应用程序引擎标准,Python2.7

" …我有一个这样的实体:

class Proposed(ndb.Model):
    foo = ndb.StringProperty(indexed=True, default=None)
    bar = ndb.IntegerProperty(indexed=True, default=0)
    date = ndb.DateTimeProperty(indexed=True, auto_now_add=True)

#… create a randomly distributed key

random_id = int(random.uniform(0, 9999999999999999))
parent_key = ndb.Key(‘Papa', random_id)

#…I parent the entity to the random key

p = Proposed(parent=parent_key)
p.foo = ‘a ball of string’
p.bar = 42
p.put()

#…and I query using inequality filter

q = Proposed.query(ndb.AND(Proposed.bar == 42,
                           Proposed.date >= start_date,
                           Proposed.date < end_date))
"

似乎表明此祖先解决方案的文档:

描述索引层次结构

索引表的行首先按祖先排序,然后按属性值排序,顺序在索引定义中指定

避免对字典顺序相近的云数据存储密钥进行高读写速率。 云数据存储是建立在Google的NoSQL数据库Bigtable之上的,并且受制于Bigtable的性能特征。Bigtable通过将行分片到单独的平板电脑上进行缩放,这些行按键按字典顺序排列

替代解决方案:

1创建带有随机哈希前缀的datetime字符串属性。 2使日期时间字符串的顺序颠倒:毫秒:秒:分钟:小时日:月:年

我看到了这些解决方案是如何使用相等过滤器进行查询的,但是我将在日期上使用不相等过滤器,我看不到如何使用该方法查询一系列日期


谦虚的感谢

您将希望使用前缀众所周知的1变体。如果前缀不太清楚,则很难按时间戳查询实体。如果不希望按时间戳查询,则可以禁用时间戳属性的索引。最后,我们将讨论更多细节


实体祖先对单调递增的索引值没有帮助,因为云数据存储仍然允许您按种类进行查询,例如按日期从提议的订单中选择*。此查询不使用祖先,因此您可以推断所使用的索引不使用祖先。

谢谢Jim。这就是我害怕的。我需要按x>=开始日期和x<结束日期进行查询。也许我可以找到一种方法来制作一个均匀分布的伪随机散列,这个散列可以预先设置好。你不必担心散列的均匀分布,每个前缀值每秒会有500次写入,而代价是额外的查询。也就是说,您可以使用AND查询的另一部分。在本例中:Proposed.querydb.ANDProposed.prefixed_date>'%s-%s'%42,start_date,Proposed.prefixed_date Ahh,所以有点像切分。1我将DateTimeProperty转换为StringProperty,类似于“yyyy-mm-dd-hh-mm-ss”。2预处理我认为需要的尽可能多的预定碎片。例如:“42-yyyy-mm-dd-hh-mm-ss”、“43-yyyy-mm-dd-hh-mm-ss”。3然后为每个碎片添加一个查询。4随着我的应用程序越来越成功,添加更多碎片。好啊我试试看。我感谢你的帮助。