Можно ли спроектировать один индекс Google Datastore для этих двух запросов? - PullRequest
0 голосов
/ 20 октября 2019

Я хотел бы знать, возможно ли спроектировать индексы и запросы Google Datastore таким образом, чтобы я мог уменьшить количество составных индексов, необходимых для моего проекта.

Я пытался использовать один индексэто работает с обоими моими запросами, как в примере, найденном здесь . Тем не менее, я не могу найти способ для одного индекса работать с моими запросами, и я не знаю, существует ли он вообще. Ниже приведены два запроса, с которыми я работал, и рекомендации по индексам хранилища данных, которые я получаю для обоих. Есть ли что-то, что я мог бы сделать по-другому, чтобы эти запросы работали с одним индексом?

Запрос 1:

CompositeFilter.and(
    CompositeFilter.and(PropertyFilter.gt("time", time1), PropertyFilter.lt("time", time2)), 
    PropertyFilter.eq("user", user1),
    PropertyFilter.eq("color", color1), 
    PropertyFilter.eq("bpm", bpm1));

addOrderBy(OrderBy.asc("time"), OrderBy.asc("location"));

Запрос индекса 1 Предложение:

- name: color
- name: bpm
- name: user
- name: time
- name: location

Запрос2:

CompositeFilter.and(
    CompositeFilter.and(PropertyFilter.gt("time", time1), PropertyFilter.lt("time", time2)),
    PropertyFilter.eq("user", user1));

addOrderBy(OrderBy.asc("time"), OrderBy.asc("color"), OrderBy.asc("bpm"), OrderBy.asc("location"));

Запрос индекса 2 Предложение:

- name: user
- name: time
- name: color
- name: bpm
- name: location

1 Ответ

1 голос
/ 20 октября 2019

Я предполагаю, что "созданный" на самом деле является "временем", так как вы используете "время" в фильтре и "создан" в упорядочении.

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

В вашем первом запросе у вас есть фиксированные пользователь, цвет и количество ударов в минуту, и для заданного промежутка времени, который вы хотите упорядочить по времени и местоположению. Таким образом, вам нужно иметь префикс-столбцы user, color и bpm, а затем время и местоположение.

Во втором запросе у вас есть только фиксированный пользователь и для заданного временного диапазона, который вы хотите упорядочить по времени,цвет, ударов в минуту и ​​местоположение. Это означает, что пользователь является единственным разделом, и тогда сканирование должно произойти немедленно в течение определенного промежутка времени. В этом случае цвет и BPM приходят после времени для поддержки порядка сортировки.

Вот почему невозможно обойтись без единого индекса. Однако, если ваши данные для заданного пользователя и диапазона времени, к которому вы обращаетесь, невелики, вы можете просто получить индекс по пользователю и времени, а затем выполнить сортировку в памяти после получения результатов. Если вы хотите использовать проекционный запрос, то вам понадобятся все столбцы и ваш второй индекс с фильтрацией в памяти (для точных ударов в минуту и ​​цвета) и потребуется сортировка.

...