Рекомендации Datastore NDB при запросах и извлечении тысяч строк
Я использую High Replication Datastore вместе с ndb
, у меня есть kind
с более чем 27 000 объектов, что не так уж много. Предположительно, хранилище данных эффективно запрашивает и извлекает большие объемы данных, но всякий раз, когда я выполняю запросы такого рода, выполнение запросов занимает много времени (у меня даже есть DeadlineExceededErrors).
У меня есть модель, где я храню ключевые слова и URL, которые я хочу проиндексировать в Google:
class Keywords(ndb.Model):
keyword = ndb.StringProperty(indexed=True)
url = ndb.StringProperty(indexed=True)
number_articles = ndb.IntegerProperty(indexed=True)
# Some other attributes... All attributes are indexed
В настоящее время я использую мои файлы Sitemap и выбираю 20 лучших ключевых слов для ссылки со страницы моей надежды.
Когда я выбираю много сущностей, я обычно делаю:
Keywords.query().fetch() # For the sitemap, as I want all of the urls
Keywords.query(Keywords.number_articles > 5).fetch() # For the homepage, I want to link to keywords with more than 5 articles
Есть ли лучший способ извлечь данные?
Я пытался проиндексировать данные в Search API, и я увидел огромный прирост скорости. Даже при том, что это работает, я не думаю, что это идеально, чтобы копировать данные из хранилища данных в Search API с в основном теми же полями.
Заранее спасибо!
2 ответа
Я бы разделил эту функциональность.
Для домашней страницы вы можете использовать ваш второй запрос, но добавьте, как советует Бруйер, параметр limit=20. Такой запрос должен выполняться очень быстро, если у вас правильный индекс.
Карта сайта - большая проблема. Обычно для обработки большого количества объектов вы используете Map Reduce. Это, вероятно, хорошая идея, но только если у вас не слишком много запросов к карте сайта. Это также может быть единственным решением, если вы часто обновляете ключевые слова и хотите максимально актуальную карту сайта.
Другим вариантом может быть создание карты сайта в задаче, сохранение ее в виде большого двоичного объекта и обслуживание этого большого двоичного объекта в запросе. Это действительно быстро. Если ваши обновления ключевых слов встречаются не часто, вы можете запустить эту задачу после любого обновления. Если у вас много обновлений, вы можете запланировать периодическое выполнение задачи в cron. Если вы успешно используете API поиска, то это, вероятно, лучший вариант для вас.
Вообще говоря, я не считаю хорошей идеей использовать хранилище данных для извлечения больших объемов данных. Рекомендую хотя бы посмотреть сравнение Datastore с традиционными базами данных. Он предназначен для работы с большими базами данных, но не обязательно с большими наборами результатов. Я бы сказал, что хранилище данных предназначено для обработки большого количества небольших запросов.
Скорость БД связана с количеством возвращаемых результатов, а не с количеством записей в БД. Ты говоришь:
создать мой файл Sitemap и выбрать 20 лучших ключевых слов
Если это так, добавьте лимит =20 в обеих выборках. Если вы делаете это таким образом, используйте вместо этого run согласно документам:
https://developers.google.com/appengine/docs/python/datastore/queryclass