Рекомендации 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

Другие вопросы по тегам