Google Cloud Datastore Индексы для запросов количества

1

В хранилище данных Google для облаков указано, что должны быть созданы составные индексы, созданные для запроса по нескольким полям одного типа. Например, используя следующий запрос:

class Greeting(ndb.Model):
    user = ndb.StringProperty()
    place = ndb.StringProperty()

# Query 1
Greeting.query(Greeting.user == '[email protected]', Greeting.place == 'London').fetch()
# Query 2
Greeting.query(Greeting.user == '[email protected]', Greeting.place == 'London').count()

Я использую python с ndb для доступа к облачному хранилищу данных. В приведенном выше примере Query 1 повышает значение NeedIndexError если нет составного индекса, определенного для user и place. Но Query 2 отлично работает, даже если нет индекса для user и place.

Я хотел бы понять, как облачный хранилище данных выбирает счетчик (Query 2) без индекса, когда он задает индекс для получения списка объектов (Query 1). Я понимаю, что он хранит статистику по каждому виду на индекс, что приведет к более быстрому отклику для подсчета существующих индексов (см. Документы). Но я не могу объяснить вышеприведенное поведение.

Примечание. Нет проблем при запросе на одно свойство данного типа, поскольку облачный хранилище данных имеет индексы по отдельным свойствам по умолчанию.

Теги:
google-cloud-datastore
app-engine-ndb

1 ответ

1
Лучший ответ

Нет четкого и прямого объяснения причин этого, но, скорее всего, из-за того, как улучшенный планировщик запросов работает с индексами zigzag.

Подробнее об этом можно узнать здесь: https://cloud.google.com/appengine/articles/indexselection#Improved_Query_Planner

Логика count() working и fetch() не существует, потому что с count() вам не нужно сохранять в памяти много результатов.

Таким образом, в случае count() вы можете легко масштабировать, разбивая работу на несколько кусков, обрабатываемых параллельно, а затем просто суммируйте соответствующие счета в один. Вы не можете сделать это дешево с курсорами/наборами записей.

  • 0
    Означает ли это, что если я добавлю индекс в поля в запросе количества явно, это не улучшит производительность? Мне просто любопытно понять, не будет ли отсутствие индекса ухудшать производительность запросов.
  • 1
    Добавление индекса улучшит вашу производительность чтения и, вероятно, сделает более дешевым выполнение запросов, хотя вам потребуется запустить тест для его подтверждения. Хотя добавление индекса увеличит ваши затраты на запись и хранение.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню