【问题标题】:GAE DataStore Retrieving Entities by Keys and Filter by Dates - Slow PerformanceGAE DataStore 按键检索实体并按日期过滤 - 性能缓慢
【发布时间】:2017-06-01 07:08:58
【问题描述】:

我使用 NDB 查询通过 IN 运算符的键列表检索实体,然后按日期过滤。该查询被分解为几个子查询,这些子查询是用 doc 编写的。并按顺序而不是并行运行。

class Post(ndb.Model):
  modified_date = ndb.DateTimeProperty()

# query
posts = Post.query(
  Post.key.IN(keys),
  Post.modified_date >= start_date,
  Post.modified_date <= end_date).fetch()

查询分析图显示顺序运行的子查询。 25 个键大约需要 0.3 秒。查询延迟与要获取的键数成线性关系。

有什么方法可以优化查询,按键检索实体并按日期范围过滤的最佳做法是什么?

【问题讨论】:

    标签: google-app-engine google-cloud-datastore app-engine-ndb google-app-engine-python


    【解决方案1】:

    问题在于 IN 运算符。

    对于键中的每个键,GAE 将执行单独的查询。

    来自 GAE 文档:

    IN 运算符还执行多个查询:对指定列表中的每个项目执行一个查询,所有其他过滤器不变,IN 过滤器替换为等式 (=) 过滤器。结果按列表中项目的顺序合并。如果一个查询有多个 IN 过滤器,它将作为多个查询执行,每个查询对应 IN 列表中的每个可能的值组合。

    包含不等于 (!=) 或 IN 运算符的单个查询仅限于 不超过 30 个子查询。

    https://cloud.google.com/appengine/docs/standard/python/datastore/queries

    modified_date是ok的,因为有索引,所以效率高。

    【讨论】:

    • 谢谢。我了解 IN 运算符会有子查询。令我惊讶的是子查询是按顺序执行的,而不是并行执行的。有没有办法让子查询并行执行?
    • 是的。而不是调用 ferch。调用 fetch_async
    • 我尝试调用 fetch_async().get_result() 并且仍然看到大量子查询,它们只查询一个实体,按顺序运行。与 fetch() 相同。 posts = Post.query(conditions).fetch_async().get_result(),你的意思是我应该通过异步查询每个实体并合并结果来实现我自己版本的 IN 运算符?
    • 你是在生产服务器还是在开发服务器?您是否在生产环境中尝试过?
    • 我在生产环境中尝试过并从 StackDriver Trace 获取分析图。
    猜你喜欢
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多