Python 2.7 查询和提取数千行时的数据存储NDB最佳实践

Python 2.7 查询和提取数千行时的数据存储NDB最佳实践,python-2.7,google-app-engine,google-cloud-datastore,app-engine-ndb,Python 2.7,Google App Engine,Google Cloud Datastore,App Engine Ndb,我正在使用高复制数据存储以及ndb。我有一种类型,拥有27000多个实体,这并不多。据推测,数据存储在查询和提取大量数据方面是高效的,但每当我查询此类数据时,查询都需要很长时间才能完成(我甚至会遇到deadlineexcedederrors) 我有一个模型,我在其中存储我想在Google中索引的关键字和URL: class Keywords(ndb.Model): keyword = ndb.StringProperty(indexed=True) url = ndb.Strin

我正在使用高复制数据存储以及
ndb
。我有一种
类型
,拥有27000多个实体,这并不多。据推测,数据存储在查询和提取大量数据方面是高效的,但每当我查询此类数据时,查询都需要很长时间才能完成(我甚至会遇到deadlineexcedederrors)

我有一个模型,我在其中存储我想在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
有没有更好的方法提取数据

我曾尝试将数据索引到搜索API中,我看到了巨大的速度提升。尽管这是可行的,但我认为用基本相同的字段将数据从数据存储复制到搜索API中并不理想


提前谢谢

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

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

如果是这种情况,则在两次回迁中添加limit=20。如果这样做,请按照以下文档使用run:


我将拆分此功能

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

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

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


一般来说,我认为使用数据存储检索大量数据不是一个好主意。我建议至少看一眼。它设计用于处理大型数据库,但不一定是大型结果集。我想说,数据存储是为处理大量的小请求而设计的。

您是否有一个涵盖您正在应用的过滤器的索引?您需要解释您的用例。你为什么要一次把它们都拿来-/你需要什么?为什么一次获取所有实体?通常,我们使用一个寻呼机,如果你想为每个实体创建一个流程,你只需要在寻呼机上迭代就可以了。我已经更新了文章,提供了更多细节和用例,谢谢!