Performance 数据存储获取VS获取(仅键=True),然后获取多个

Performance 数据存储获取VS获取(仅键=True),然后获取多个,performance,google-app-engine,database-design,google-cloud-datastore,Performance,Google App Engine,Database Design,Google Cloud Datastore,我正在使用下面的查询从数据存储中提取多个实体100多个 返回entity.query(祖先=ancestorKey).filter(entity.year=myStartYear).order(entity.num).fetch() 这需要很长时间(几秒钟)才能加载 为了找到一个最佳的方法,我创建了100个实体,发现在本地服务器上获取100个实体需要750ms~1000ms的时间,这当然是很多。我不知道如何绕过一个单一的行获取,以使它更有效 在一次绝望的优化尝试中,我尝试了 移除订单部分,仍然得

我正在使用下面的查询从数据存储中提取多个实体100多个

返回entity.query(祖先=ancestorKey).filter(entity.year=myStartYear).order(entity.num).fetch()

这需要很长时间(几秒钟)才能加载

为了找到一个最佳的方法,我创建了100个实体,发现在本地服务器上获取100个实体需要750ms~1000ms的时间,这当然是很多。我不知道如何绕过一个单一的行获取,以使它更有效

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

  • 移除订单部分,仍然得到相同的结果
  • 移除过滤器部分,仍然得到相同的结果
  • 移除顺序过滤器部分,仍然得到相同的结果
  • 很明显,这是另外一回事。在一次绝望的尝试中,我只尝试获取密钥,然后将密钥传递给ndb。get_multi()函数:

    qKeys=entity.query(祖先=ancestorKey).filter(entity.year=myStartYear).order(entity.num).fetch(keys\u only=True)

    返回ndb.get_multi(qKeys)

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

    我不知道为什么会发生这种情况,我本以为fetch函数已经在最合适的时间查询实体了

    问题: 知道如何优化单个查询行以更快地加载吗

    附带问题:
    任何人都知道fetch函数的底层机制是什么,为什么只提取密钥,然后使用ndb.get_multi()更快?

    FWIW,您不应该期望使用开发服务器或数据存储模拟器在本地执行的数据存储性能测试会产生有意义的结果-它们只是模拟器,它们没有与真实数据存储相同的性能(甚至没有100%的等效功能)

    归功于@snakecharmerb,他正确识别了罪犯,经OP确认:


    请注意,云中的性能特征可能与 在你的本地机器上。你真的想运行这些测试吗 在云端昨天玩蛇人

    @你的建议是对的!刚刚在网上测试过 云实际上是另一种方式,在云计算方面 演出fetch()~550ms,fetch(仅限键)然后get_multi为~700ms 看来fetch()在云上工作得更好昨天哈立德


    首先获取密钥,然后从密钥中获取数据,可以从ndb缓存实体的能力中获益。检查您的改进%是否可重复,如果不是,ndb缓存可能是一种可能的解释。试着在测试前擦除应用程序的memcache。另一个想法是:祖先查询具有很强的一致性,这意味着只要收集并返回所有实体的数据,就需要使用确保返回的数据始终一致的机制。对于只搜索关键字,搜索时间要短得多(get_多操作不是同一事务操作的一部分)。Donno如果这可以解释性能差异,tho。尝试与返回相同数量和大小结果的非祖先查询进行比较。请注意,云中的性能特征可能与本地计算机上的性能特征不同。您真的想在云中运行这些测试。@DanCornilescu为您提供了强一致性说明,您的意思是get_multi不遵循强一致性吗?我相信我在文档的某个地方读到,通过实体的键获取实体总是非常一致的,不是吗?我将尝试擦除memcache并发布results@Khaled-不,我只是说从查询中获取键和从键中获取值没有联系在一起-在两次操作之间,实体仍然可以更改甚至消失(这并不意味着不强一致),当直接从查询中获取值时,我认为它们不会改变(否则它们的查询将不具有很强的一致性)。