Python 对于单个KeyProperty,纯keys_查询和投影查询之间的性能差异是什么?

Python 对于单个KeyProperty,纯keys_查询和投影查询之间的性能差异是什么?,python,performance,google-app-engine,Python,Performance,Google App Engine,众所周知,应用程序引擎中的仅密钥查询速度很快 Google App Engine现在能够运行“投影查询”,该查询只能返回部分实体数据 假设我有一个包含大量属性和记录的模型(反序列化成本很高),我想知道运行一个在该对象上返回一个KeyProperty的投影查询与执行一个keys\u only查询之间的性能差异是什么 这两种方法不是都只使用索引,使它们的性能相同吗?或者,在一个只包含关键字的查询中是否有某种内在的东西可以使它更快 一个简单的例子: class SomeObject(ndb.Mode

众所周知,应用程序引擎中的仅密钥查询速度很快

Google App Engine现在能够运行“投影查询”,该查询只能返回部分实体数据

假设我有一个包含大量属性和记录的模型(反序列化成本很高),我想知道运行一个在该对象上返回一个KeyProperty的投影查询与执行一个keys\u only查询之间的性能差异是什么

这两种方法不是都只使用索引,使它们的性能相同吗?或者,在一个只包含关键字的查询中是否有某种内在的东西可以使它更快

一个简单的例子:

class SomeObject(ndb.Model):
   user = ndb.KeyProperty()
以下各项之间的性能差异是什么:

SomeObject.query().fetch(1000, projection=["user"])


为什么? 这并不是确切的“为什么”,但其接近的原因是:我正在权衡

将数据拆分为不同的类型,并使用实体组仅为子项设置关键帧,然后为父项设置多个关键帧(类似于Bret Slatkins Google I/O视频中显示的消息应用程序)

vs

将父键放入子表,然后使用投影查询仅获取父键,然后获取多个父键

还有很多其他的考虑,我不会让你感到厌烦。。。但是如果我知道这个性能问题的答案,它会减少我的设计选项

是的,我可能会在本地做我自己的测试。。。但是如果有一个知道的人能给出一个明确的答案那就太棒了。。。很高兴与大家分享这方面的知识,因为到目前为止,我还没有在任何地方找到它

谢谢大家!


更新
一些基本测试向我表明,一个只包含关键字的查询比一个完整查询快10倍左右(这与研究一致)。。。单个KeyProperty上的投影查询所需的时间大约是纯键查询的两倍(因此大约快5倍)

非常简单。Keys_only参数比投影更快,因为您提供的对象只有一个从数据库获取的键。投影提供了该对象的关键,并剪切了他的数据。 投影执行是这样的:

  • 从数据库获取密钥
  • 使用键读取对象
  • 减少不需要的数据

  • 仅按键执行是该列表中的唯一第一点。我写的流程不是100%正确的,因为GAE在一个流程中完成了第二步和第三步,但该列表应该会告诉您为什么这样做,以及为什么您会获得结果之间的差异。

    我非常确定,要知道这个问题的答案,需要了解GAE数据库的内部工作原理(我上次检查的大表现在可能是Dremel),但在我看来,一个关键的查询总是会更快。键本质上是指向实体的路径,因此它不需要索引查找——至少在常规查询的意义上不需要。嗯。。。如果我没有弄错的话,keys_还使用memcache。此外,您的所有测试都必须仔细了解应用了哪些缓存设置。
    SomeObject.query().fetch(1000, keys_only=True)