【问题标题】:Datastore NDB best practices when querying and extracting thousands of rows查询和提取数千行时的数据存储 NDB 最佳实践
【发布时间】:2014-08-10 20:58:36
【问题描述】:

我正在使用高复制数据存储以及ndb。我有一个kind 有超过 27,000 个实体,这不算多。假设数据存储区在查询和提取大量数据方面效率很高,但是每当我查询这种类型的数据时,查询都需要很长时间才能完成(我什至遇到了 DeadlineExceededErrors)。

我有一个模型,用于存储要在 Google 中编制索引的关键字和 URL:

class Keywords(ndb.Model):
    keyword = ndb.StringProperty(indexed=True)
    url = ndb.StringProperty(indexed=True)
    number_articles = ndb.IntegerProperty(indexed=True)
    # Some other attributes... All attributes are indexed

我目前的用例是构建我的站点地图,并获取我的前 20 个关键字以从我的希望页面链接。

当我获取许多实体时,我通常会这样做:

Keywords.query().fetch() # For the sitemap, as I want all of the urls
Keywords.query(Keywords.number_articles > 5).fetch() # For the homepage, I want to link to keywords with more than 5 articles

有没有更好的方法来提取数据?

我尝试将数据索引到 Search API 中,并且我看到了巨大的速度提升。尽管这可行,但我认为将数据从 Datastore 复制到具有基本相同字段的 Search API 并不理想。

提前致谢!

【问题讨论】:

  • 您是否有涵盖您正在应用的过滤器的索引?
  • 你需要解释你的用例。为什么您需要一次获取所有这些? :-/
  • 您需要什么?为什么要一次获取所有实体?通常,我们使用寻呼机,如果您想为每个实体创建一个流程,您只需要在寻呼机上进行迭代。
  • 我已经更新了帖子,提供了更多详细信息和用例,谢谢!

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


【解决方案1】:

我会拆分这个功能。

对于主页,您可以使用第二个查询,但按照 Bruyere 的建议,添加 limit=20 参数。如果您有正确的索引,这样的请求应该会运行得非常快。

站点地图是一个更大的问题。通常,要处理大量实体,您使用Map reduce。 这可能是个好主意,但前提是您对站点地图的请求不多。如果您经常更新关键字实体并希望尽可能更新站点地图,它也可能是唯一的解决方案。

另一个选项可以是在任务中生成站点地图,将其保存为 blob 并在请求中提供此 blob。这真的很快。如果您对关键字实体的更新不是很频繁,那么您可以在任何更新后运行此任务。如果您有很多更新,那么您可以安排任务在 cron 中定期运行。由于您已成功使用搜索 API,那么这可能是您的最佳选择。

一般来说,我认为使用数据存储来检索大量数据并不是一个好主意。我建议至少查看Datastore comparison with traditional databases。它旨在处理大型数据库,但不一定是大型结果集。我会说数据存储旨在处理大量的小请求。

【讨论】:

    【解决方案2】:

    数据库速度与返回的结果数有关,而不是与数据库中的记录数有关。你说:

    构建我的站点地图,并获取我的前 20 个关键字

    如果是这种情况,请在两个提取中添加 limit=20。如果你这样做,那么按照文档使用 run 代替:

    https://developers.google.com/appengine/docs/python/datastore/queryclass#Query_fetch

    【讨论】:

      猜你喜欢
      • 2012-07-15
      • 2013-08-12
      • 2010-09-25
      • 2015-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-22
      • 1970-01-01
      相关资源
      最近更新 更多