Google App Engine чрезмерно небольшие операции с хранилищем данных
У меня возникли проблемы с хранилищем данных Google App Engine. С тех пор, как была введена новая модель ценообразования, стоимость запуска моего приложения значительно возросла.
Виновником, по-видимому, являются "Малые операции Datastore", которые производят более 20 миллионов операций в день!
У кого-нибудь была такая проблема, я не думаю, что я выполняю слишком много поисков по ключевым словам, и у меня всего 5000 пользователей, примерно 10 - 20 запросов в минуту.
Заранее спасибо!
редактировать
Хорошо, есть некоторые статистические данные, это примерно через 3 часа. Вот что я вижу на своей панели инструментов в разделе счетов:
А вот некоторые из характеристик:
Очевидно, что довольно много звонков на datastore.get. Я начинаю думать, что проблема заключается в моем дизайне. Те получает соответствует учетным записям. У каждого пользователя есть учетная запись, но учетная запись может быть одного из двух типов, для этого я использую композицию. Таким образом, каждая сущность учетной записи имеет ссылку на свою сущность субсчета. В результате, когда я выполняю поиск ближайших пользователей, это включает выборку учетных записей с использованием запроса, а затем выполнение каждой учетной записи, чтобы получить свою вспомогательную учетную запись. Самый верхний запрос на рисунке статистики - это вызов, который получает 100 учетных записей, а затем должен получить доступ к каждому. Я бы подумал, что это очень легкий запрос, но, думаю, нет. И я все еще смущен количеством записей операций в хранилище данных на моей панели.
4 ответа
Определенно используйте appstats, как предлагает Дрю; независимо от того, какую библиотеку вы используете, она сообщит вам, какие операции выполняют ваши обработчики. Наиболее вероятными виновниками являются запросы только по ключам и операции подсчета.
Не сканируйте свое хранилище данных, используйте как можно больше get(key) или get_by_id(id) или get_by_key_name(keyname).
У вас есть много свойств ReferenceProperty в ваших моделях? Доступ к ним вызовет db.get для каждого свойства, если вы предварительно не выберете их. Это вызовет 101 db.get запросов.
class Foo(db.Model):
user = db.ReferenceProperty(User)
foos = Foo.all().fetch(100)
for f in foos:
print f.user.name # this triggers db.get(parent=f, key=f.user)