0

Я реализовал логику запроса таблицы и для каждого объекта в этой конкретной таблице, мне нужно найти другую таблицу.Как увеличить производительность запроса gae?

Для, например.

Мой код выглядит,

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 

Вы видите, если мы дадим размер как 10 к fetch_page функции, было бы найти 10 объектов каждый. И для каждого объекта мы должны искать другой вид Image.

Этот тип поиска в хранилище данных занимает от 850 до 950 мс. Я хочу уменьшить время отклика этого API. Обратите внимание, что мне нужно получить некоторые значения столбцов от Story, а также от Images вида.

Есть ли способ сократить запрос с помощью метода get_multi. Или у меня есть идея использовать memcache или мы должны определить новый StructuredProperty в модели Foo, где это значение должно быть списком объектов модели Images.

Я не знаю, какой из них подходит в этом случае .. Pls guide me.

ответ

1

Я не знаю всю структуру вашего проекта, но ...

Вы можете сделать что-то подобное:

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

и каждый раз, когда пользователь добавит обновить его новый образ (images недвижимость от Story).

Тогда вы будете иметь возможность использовать:

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 

Надежда, что помогает.

+0

почему отдельная модель для индекса. Почему мы не определяем 'images = ndb.KeyProperty (kind = Image, repeat = True)' внутри 'Story'? –

+0

Спасибо за ваши ответы. –

+0

Конечно, вы можете это сделать. Я просто не знал всех зависимостей. – turkus

2

Вы можете добавить собственность к каждой Истории, содержащей список идентификаторов изображений. Я предполагаю, что этот список редко меняется. Тогда вы можете легко get_multi все изображения, связанные с историей без каких-либо запросов.

Вы можете также рассмотреть get_multi все изображения для всех рассказов, возвращенные вашим запросом, в один звонок, а затем при необходимости прикрепите их к соответствующим историям вашего кода.

+0

вы имеете в виду определение как images = ndb.KeyProperty (kind = Image, repeat = True) 'внутри модели истории? –

+1

Да. Вы можете использовать ключи, если хотите. Я часто использую идентификаторы вместо полных ключей, потому что они принимают меньше места, и вы всегда можете создать полный ключ из id. Но это может быть ненужной чрезмерной оптимизацией, если ваш набор данных не огромен. И я пришел со стороны Java, поэтому я не знаю, оптимизирован ли это в Python. –

+0

как этот 'ndb.key ('class_name', id) .get()' для получения сущности по id или 'cls.get_by_id (id)' –

1

Вы хотите посмотреть на ОПРС партии асинхронным 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. сделать запрос к DataStore
  2. с N результата от вышеупомянутого запроса, сделать 1 запрос, чтобы получить все истории

С, Key.get_async() также использовать Memcache автоматически, с момента секунд вы звоните выше функция, запрос 2 вызовет memcache