В хранилище данных 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). Я понимаю, что он хранит статистику по каждому виду на индекс, что приведет к более быстрому отклику для подсчета существующих индексов (см. Документы). Но я не могу объяснить вышеприведенное поведение.
Примечание. Нет проблем при запросе на одно свойство данного типа, поскольку облачный хранилище данных имеет индексы по отдельным свойствам по умолчанию.
Нет четкого и прямого объяснения причин этого, но, скорее всего, из-за того, как улучшенный планировщик запросов работает с индексами zigzag
.
Подробнее об этом можно узнать здесь: https://cloud.google.com/appengine/articles/indexselection#Improved_Query_Planner
Логика count()
working и fetch()
не существует, потому что с count()
вам не нужно сохранять в памяти много результатов.
Таким образом, в случае count()
вы можете легко масштабировать, разбивая работу на несколько кусков, обрабатываемых параллельно, а затем просто суммируйте соответствующие счета в один. Вы не можете сделать это дешево с курсорами/наборами записей.