繁体   English   中英

查询和提取数千行时的数据存储区NDB最佳做法

[英]Datastore NDB best practices when querying and extracting thousands of rows

我正在使用High Replication数据存储以及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中,并且看到了巨大的速度提升。 即使此方法可行,但我认为将数据存储区中的数据复制到具有相同字段的Search API中并不理想。

提前致谢!

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

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

如果这样的话,在两次提取中都添加limit = 20。 如果您采用这种方式,请按照文档使用run代替:

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

我将拆分此功能。

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

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

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

一般来说,我认为使用数据存储区检索大量数据不是一个好主意。 我建议至少查看一下数据存储与传统数据库的比较 它旨在处理大型数据库,但不一定处理大型结果集。 我要说的是,数据存储区旨在处理大量的小请求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM