查询和提取数千行时,数据存储区NDB最佳实践

时间:2014-08-10 20:58:36

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

我使用高复制数据存储区以及ndb。我有kind超过27,000个实体,但实际上并不多。据说数据存储区在查询和提取大量数据时效率很高,但每当我查询这类数据时,查询都需要很长时间才能完成(我甚至得到了DeadlineExceededErrors)。

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

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

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

我尝试将数据编入索引API,并且我已经看到了巨大的速度提升。即使这有效,我也不认为将数据从数据存储区复制到具有基本相同字段的Search API中是理想的。

提前致谢!

2 个答案:

答案 0 :(得分:1)

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

  

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

如果是这种情况,则在两次提取中添加限制= 20。如果你这样做,那么根据文档使用run:

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

答案 1 :(得分:1)

我会拆分此功能。

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

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

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

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