当存在多个订单属性时,加快 App Engine 本地 SDK 数据库查询速度



我有一个看起来像这样的查询:

query = (models.Foo.all()
  .filter('x =', x)
  .filter('y =', y)
  .filter('z =', z)
  .filter('zz =', zz)
  .order('-a'))

它在本地SDK上运行的时间为~100ms,并以可接受的速度在云中运行。当我添加第二个订单时(所以它看起来像这样:(

query = (models.Foo.all()
  .filter('x =', x)
  .filter('y =', y)
  .filter('z =', z)
  .filter('zz =', zz)
  .order('-a')
  .order('-b'))

..在本地 SDK 上需要 ~10 秒(长 100 倍(,并且在云中以与以前相同的速度运行。我需要有二阶属性。

有关设置的一些详细信息:

  • 视窗开发工具包版本 1.9.50
  • 蟒蛇 2.7
  • 使用db模型,而不是ndb
  • 我从一个新的本地数据库(替换了数据存储.db(开始,并从头开始重建记录
  • 本地有 ~1200 个 Foo 实体(云中 ~3M(
  • 我在本地数据库上运行了sqlite3 datastore.db "PRAGMA integrity_check,没有报告任何错误

问:如何使查询在本地运行得更快?(在 10s 一直滞后的情况下进行开发真的很难。

这可能不是您想要的答案,但开发服务器上的数据存储性能缓慢是一个长期存在的已知问题,正在公共问题跟踪器上进行跟踪。

出现

这种情况的一个原因部分是由于仿真的处理方式。如果您查看 SDK 中的google/appengine/datastore/datastore_sqlite_stub.py,您会发现对db方法的调用在某种程度上被天真地转换为基本的 SQL 查询,这些查询被馈送到本地运行的 SQLite 数据库中。

在这些情况下,在应用程序级别无法提高性能。解决方案是让 SDK 在开发服务器上执行更智能的查询转换,由 SDK 工程团队实现。

相关内容

  • 没有找到相关文章