2015-04-07 4 views
0

Пусть говорят, у меня есть два запроса для запуска:App Engine Datastore - Индексы оптимизация

# Q1 
Chair.query(ndb.AND(Chair.type == 'A', Chair.invented_at < '2014')) 

# Q2 
Chair.query(ndb.AND(Chair.type == 'A', Chair.cost == 2, Chair.invented_at < '2014')) 

Q1 и Q2 имеют фильтр неравенства, поэтому эти запросы требуют составных индексов.

Индекс, автоматически сгенерированный сервером разработки, будет содержать два индекса: по одному для каждого запроса.

# Index for Q1 
- kind: Chair 
    properties: 
    - name: type 
    - name: invented_at 

# Index for Q2 
- kind: Chair 
    properties: 
    - name: type 
    - name: cost 
    - name: invented_at 

Но не было бы более эффективным с точки зрения хранения и операции записи использовать только второй индекс (Q2) и модифицировать Q1 (это может быть возможно в некоторых случаях), поэтому он использует индекс Q2 тоже? Или проще, чтобы хранилище данных использовало меньшие, но более индексы?

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

ответ

0

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

Наличие стоимости в середине индекса для Q2 означает, что Q1 не может его использовать. Это так просто. Он упорядочен по типу, затем стоит, а затем изобретен. Я знаю, что было бы возможно, чтобы система считывала только то, что ей нужно, но для этого не будет пропускаться столбец.

Существует алгоритм zigzag merge join, который помогает минимизировать количество ваших индексов, если вы хотите, но не в этой ситуации. Вы также можете получить дополнительную информацию here

Смежные вопросы