Оптимизация запросов Google App Engine - PullRequest
0 голосов
/ 25 февраля 2012

У меня есть хранилище данных Google App Engine, в котором может быть несколько миллионов записей, и я пытаюсь найти лучший способ выполнить запрос, в котором мне нужно получить записи обратно, которые соответствуют нескольким строкам.

Например, скажем, у меня есть следующая модель:

Имя строки Уровень строки Int счет

Мне нужно вернуть все записи для данного «уровня», которые также соответствуют списку «имен»,В списке имен может быть только 1 или 2 имени, но может быть и 100.

В основном это список рекордов ("оценка") для игроков ("имя") для данного уровня ("уровень ").Я хочу найти все оценки для данного «уровня» для списка игроков по «имени», чтобы создать список рекордов, включающий только ваших друзей.

Я мог бы просто пройтись по списку «имен»"и сделать запрос для каждого их высоких баллов для этого уровня, но я не знаю, является ли это лучшим способом.В SQL я мог бы создать один (сложный) запрос для этого.

Учитывая размер хранилища данных, я хочу убедиться, что я не трачу время на запуск кода Python, который должен быть выполнен запросом илинаоборот.

"Уровень" должен быть строкой, а не Int, поскольку они не нумерованы, а скорее являются уровнями, но я не знаю, имеет ли это значение.

Ответы [ 3 ]

0 голосов
/ 25 февраля 2012

Нет, вы не можете сделать это за один проход.

Вам нужно будет либо спросить друзей об уровне один за другим

или

сделать друзей баллов для каждого уровня. Каждый раз, когда меняется счет, проверьте, к какому списку друзей он принадлежит, и обновите все их списки. Тогда это просто вопрос или поиск этого списка.

первый будет медленным, а второй дорогостоящим, если не оптимизирован.

0 голосов
/ 25 февраля 2012

Вы можете использовать IN оператор фильтра , чтобы сопоставить свойство со списком значений (имен пользователей):

scores = Scores.all().filter('level ==', level).filter('user IN', user_list)

Обратите внимание, что под капотом выполняется столько запросов, сколько пользователей в user_list.

0 голосов
/ 25 февраля 2012
players = Player.all().filter('level =', level).order('score')  

names = [name1, name2, name3, ...]

players = [p for p in players if p.name in names]

for player in players:
    print name, print score

это то, что вы хотите?
... или я слишком много упрощаю?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...