App Engine GQL запрашивает диапазон свойств - PullRequest
0 голосов
/ 08 января 2010

поэтому у меня есть класс пользователя

class User(db.Model):
  points = db.IntegerProperty()

, поэтому я создал 1000 фиктивных сущностей на сервере разработки с точками в диапазоне от 1 до 1000

query = db.GqlQuery("SELECT * FROM User WHERE points >= 300"
                     "AND points <= 700"
                     "LIMIT 20"
                     "ORDER BY points desc")

Я хочу только 20 результатов на запрос(достаточно, чтобы заполнить страницу).Мне не нужно разбивать результаты на страницы.

Все выглядит хорошо, все работает на сервере разработки.

Вопрос:
1. Будет ли оно работать на рабочем сервере с 100 000 -500 000 пользовательских объектов?Буду ли я испытывать большое отставание?Надеюсь, что нет, потому что я слышал, что App Engine автоматически индексирует столбец точек
2. Какие еще методы оптимизации вы можете порекомендовать?

Ответы [ 2 ]

1 голос
/ 09 января 2010

Ваш код, кажется, отлично подходит для топ-пользователей, но более сложные запросы, такие как определение ранга любого конкретного пользователя, будут трудными. Если вам также нужны такие функции, взгляните на google-app-engine-ranklist .

Ranklist - это библиотека Python для Google App Engine, которая реализует структура данных для хранения целых чисел баллы и быстро восстановить их относительные звания.

1 голос
/ 08 января 2010

Я думаю, что трудно сказать, какие проблемы с производительностью вы будете иметь с таким большим количеством объектов. Этот конкретный запрос, вероятно, подойдет, но вы должны знать, что ни один запрос к хранилищу данных не может вернуть более 1000 сущностей, поэтому, если вам нужно работать с числами, превышающими 1000, вам придется делать это партиями, и вы можете хочу разделить их на отдельные группы объектов.

Что касается оптимизации, вы можете рассмотреть возможность кэширования результатов этого запроса и выполнения его только тогда, когда вы знаете, что информация изменилась или через определенные промежутки времени. Если запрос предназначен для какой-то цели, где совершенно правильные результаты не являются абсолютно критичными - скажем, отображение таблицы лидеров или списка рекордов - вы можете обновлять и кэшировать результат один раз в час или что-то в этом роде.

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

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