Составной индекс (с индексом массива) против составного индекса и индекса отдельного массива в couchbase N1QL - PullRequest
0 голосов
/ 22 марта 2019

Какова производительность, использование диска и скорость составного индекса (с индексом массива) и составного индекса с отдельным индексом массива?

Допустим, у меня есть документ со структурой, подобной этой

key1:value1,
key2:value2,
key3:value3,
key4:value4,
data:[
    value5,
    value6,
    value7,
},
key8:value8

Из того, что я понимаю в Couchbase N1QL, если я создаю индекс и запрос, аналогичный:

CREATE INDEX indx_data ON document(key1,key4, ALL DISTINCT ARRAY v FOR v IN data END

SELECT * FROM document WHERE key1=value1 AND key4=value4 AND ANY v IN data SATISFIES v=value5 END AND ANY v IN data SATISFIES v=value6

Первая часть индекса будет использоваться в запросе, но со вторым значением для данных (ANY v IN data SATISFIES v=value6) индекс не будет использоваться? Так что было бы лучше иметь индекс для key1 и key4, а затем отдельный индекс для массива, чтобы можно было сравнить его? Или есть способ использовать составной индекс, включая массив?

Также еще один вопрос, который только что появился:

Лучше иметь документ для индексации, как я только что представил или похож на:

key1:value1,
key2:value2,
key3:value3,
key4:value4,
data:{
    key5:value5,
    key6:value6,
    key7:value7,
},
key8:value8

Этот вопрос также производительность

1 Ответ

0 голосов
/ 22 марта 2019

Проверяете ли вы, что массив данных имеет значение 5 или значение 6 или должен содержать оба значения.

Если вы ищете значение 5 или значение 6, следует использовать следующее.В запросе используется индекс нажатия всех трех клавиш.Вы можете проверить с помощью EXPLAIN (проверьте интервалы)

ЛЮБОЙ v IN. УДОВЛЕТВОРИТЬ v IN [значение5, значение6] КОНЕЦ

Если вы ищете как значение 5, так и значение 6, вы должны использовать следующее.,В запросе используется индекс нажатия всех трех клавиш.Но здесь два разных сканирования индекса выполняют пересечение (строка индекса имеет только одно значение за один раз). Вы можете проверить, используя EXPLAIN (проверьте промежутки)

ЛЮБОЙ v В данных SATISFIES v = значение5 КОНЕЦ И ЛЮБОЙ v В данных SATISFIES v= value6 END

Если вы не хотите пересекать, вы можете сделать следующее.Запрос использует индекс, нажимает все три ключа и применяет фильтр данных значения 6 IN после сканирования индекса

ЛЮБОЙ IN IN ДАННЫХ Удовлетворяет v = значение 5 КОНЕЦ И значение 6 В данных

...