如何提高gae查询的性能?

2024-06-01 10:07:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我实现了查询一个表的逻辑,对于该表中的每个实体,我必须查找另一个表。你知道吗

因为,例如

我的代码看起来像

query = ndb.gql("select * from Foo where user = :1", user.key)
stories, next_cursor, more = query.fetch_page(size, start_cursor=cursor)
if next_cursor:
   for story in stories:
       print story.key
       images = ndb.gql("select * from Images where story = :1", story.key)
       for image in images:
           print image.key
else:
   #do some operations

你看,如果我们把fetch\u page函数的大小设为10,它会找到10个实体。对于每个实体,我们必须查找另一种Image。你知道吗

这种类型的数据存储查找需要850到950毫秒。我想减少此API的响应时间。 注意,我必须从Story类和Images类中获取一些列值。你知道吗

是否仍然可以使用get_multi方法来缩短查询。或者,我有一个使用memcache的想法,或者我们应该在Foo模型中定义一个新的StructuredProperty,它的值必须是Images模型实体的列表。你知道吗

我不知道哪一个适合这个案子。。请引导我。你知道吗


Tags: keyfrom实体foowherequeryselectcursor
3条回答

您需要了解NDB批处理异步API

   @ndb.tasklet
   def get_stories(user_key):
     stories = yield Story.query(Story.user_key == user_key).fetch_async()
     futs = [
       item.key.get_async() for item in stories]
     result = yield futs
     raise ndb.Return(result)

   get_stories(user_key).get_result()

此API将只调用2个查询。你知道吗

  1. 对数据存储进行查询
  2. 使用上述查询的N个结果,进行1个查询以获取所有故事

因为,Key.get_async()也会自动使用memcache,所以从您调用上述函数的秒数开始,2查询将调用memcache

可以向每个包含图像ID列表的故事添加属性。我想这个列表很少改变。然后您可以轻松地get_multi与一个故事相关的所有图像,而无需任何查询。你知道吗

您还可以考虑在单个调用中get_multi查询返回的所有故事的所有图像,然后在必要时将它们“附加”到代码中相应的故事中。你知道吗

我不知道你项目的整体结构,但是。。。你知道吗

你可以这样做:

class Story(ndb.Model):
    images = ndb.KeyProperty(kind=Image, repeated=True)
    user = ndb.KeyProperty(kind=User)

并且每次用户添加新图像时都会更新它(imagesStory属性)。你知道吗

然后您就可以使用:

images = []
stories = Story.query.filter(Story.user == user.key)
stories = stories.fetch(size)
for story in stories:
    images.extend(ndb.get_multi(story.images))
print images

希望有帮助。你知道吗

相关问题 更多 >