3

众所周知,应用引擎中的 keys_only 查询速度很快。

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

https://developers.google.com/appengine/docs/python/ndb/queries?hl=pl#projection

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

难道这两种方法都只使用索引,使它们具有同样的性能吗?或者,keys_only 查询内部是否有一些固有的东西可以使它更快?

一个简单的例子:

class SomeObject(ndb.Model):
   user = ndb.KeyProperty()

之间的性能差异是什么:

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

SomeObject.query().fetch(1000, keys_only=True)

为什么?

这不完全是“为什么”,但它足够接近:我正在权衡一个数据模型之间的差异

将数据拆分为单独的种类并使用实体组来 key_only 孩子然后 get_multi 父母(类似于 Bret Slatkins Google I/O 视频中显示的消息传递应用程序)

对比

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

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

是的,我可能会在本地进行自己的测试......但是从知情人士那里得到明确的答案会很棒......而且分享这些知识也很好,因为我无法在任何地方找到它到目前为止

谢谢!


更新

一些基本测试显示,keys_only 查询比完整查询快约 10 倍(这与研究一致)......并且单个 KeyProperty 上的投影查询所需时间大约是 keys_only 查询的两倍(所以大约快 5 倍)

4

1 回答 1

-1

这很简单。Keys_only 参数比投影更快,因为您提供的对象的唯一键是从数据库中获取的。投影提供了该对象的密钥并剪切了他的数据。投影执行是这样的:

  1. 从数据库中获取密钥
  2. 使用键读取对象
  3. 减少不需要的数据

Keys_only 执行只是该列表中的第一个点。我写的那个流程不是 100% 正确的,因为 GAE 在一个步骤中执行了第二步和第三步,但是该列表应该向您展示为什么会这样工作以及为什么您会在结果之间获得这种差异。

于 2014-01-07T21:19:52.577 回答