为了降低GAE Python使用成本,我想优化数据库读取操作。你有什么建议吗?
我无法理解为什么GAE显示的DB读取操作比我想象的要多得多。如果你能给出GAE如何计算DB读操作的一般逻辑,那么它也应该非常有用。
谢谢!
答案 0 :(得分:4)
您可以在此处详细了解低级操作(小型,读取,写入)中的高级操作(获取,查询,放置,删除...)成本 - https://developers.google.com/appengine/docs/billing(向下滚动大约一半)。
我强烈建议您使用AppStats来帮助追踪您的阅读操作的来源。需要注意的一件重要事情是不要将offset
选项与.fetch()
一起用于分页,因为这只是跳过结果,但仍然需要读取费用。这意味着如果你执行.fetch(10, offset=20)
,则会花费30次读取。您想改用query cursors。
另一个优化是通过密钥(.get(keys)
)与查询来获取,这将只花费1次读取操作,而不是查询返回的每个实体的查询成本1读取+ 1读取(因此查询使用1实体返回成本2读取,但同一实体的.get()
只需要1次读取。您可能还需要查看使用projection queries,查询的成本为1,但只有1检索到的每个投影实体小(注意:所有预测的属性都必须编入索引)。
此外,如果您尚未使用,则应使用自动NDB API提取的caches,这将有助于减少您的阅读操作。与官方文档一起,Rodrigo和Guido的NDB cheat sheet是从ext.db过渡到ndb的好方法。
在管理数据存储空间使用下有一些很好的提示: https://developers.google.com/appengine/articles/managing-resources
最后,您可能还有兴趣使用gae_mini_profiler,它可以方便地访问AppStats以获取当前请求,以及其他有用的分析和日志记录信息。
答案 1 :(得分:1)
很难说为什么没有看到你的代码,但如果你还没有,请使用memcache来保存数据库读取。
https://developers.google.com/appengine/docs/python/memcache/usingmemcache