数据存储区获取VS fetch(keys_only = True)然后获取get_multi

时间:2017-11-13 18:51:54

标签: performance google-app-engine database-design google-cloud-datastore

我使用下面的查询

从数据存储中获取多个100+实体
  

返回实体 .query(ancestor = ancestorKey )。filter( entity .year = myStartYear )。顺序(实体 .num).fetch()

加载需要花费很长时间(几秒的顺序)。

试图找到一种最佳方式,我创建了100个实体,发现在本地服务器上获取100个实体需要750ms~1000ms之间的任何时间,这当然很多。我不知道如何绕过单行获取以提高效率!

在绝望的优化尝试中,我尝试了

  1. 删除订单部分,仍然得到相同的结果
  2. 删除过滤器部件,仍然得到相同的结果
  3. 删除订单& 过滤器部件,仍然获得相同的结果
  4. 显然这是别的东西。在绝望的尝试中,我尝试获取密钥,然后将密钥传递给 ndb.get_multi()函数:

      

    qKeys = entity .query(ancestor = ancestorKey )。filter( entity .year = myStartYear ) .order(实体 .num).fetch(keys_only = TRUE)

         

    返回ndb.get_multi(qKeys)

    令我惊讶的是,我获得了更好的吞吐量!查询结果现在加载450~550ms,大约 ~40%平均性能更好!

    我不确定为什么会发生这种情况,我认为 fetch 函数已经在最佳时间内查询实体。

    问题: 知道如何优化单个查询行以加快加载速度吗?

    旁边问题: 任何人都知道获取函数的底层机制是什么,以及为什么只获取键,然后使用ndb.get_multi()更快?

1 个答案:

答案 0 :(得分:2)

FWIW,您不应期望使用开发服务器或数据存储模拟器从本地执行的数据存储区性能测试获得有意义的结果 - 它们只是模拟器,它们不具有相同的性能(或者甚至是100%等效的功能)作为真正的数据存储区。

归功于@snakecharmerb,他正确识别了罪魁祸首,由OP确认:

  

请注意,云中的性能特征可能不同   那些在你的本地机器上。你真的想要运行这些测试   在云端。 - 昨天的snakecharmerb

     

@snakecharmerb你对你的建议是正确的!刚刚测试过   云计算实际上是云计算的另一种方式   性能。 fetch()~550ms,fetch(keysonly)然后get_multi是~700ms   似乎fetch()在云上运行得更好! - 昨天哈立德