как работает несколько индексов для столбцов с низкой мощностью на кассандре? - PullRequest
2 голосов
/ 08 июля 2020

Я пытаюсь создать несколько индексов в своем хранилище данных Cassandra. У меня была схема, как показано ниже

id: integer primary key
field1: text
field2: text
field3: text
field4: int

Я создаю несколько индексов для разных столбцов

CREATE INDEX filed1_index ON mykeyspace.mytable ( field1 );
CREATE INDEX filed2_index ON mykeyspace.mytable ( field2 );
CREATE INDEX filed4_index ON mykeyspace.mytable ( field4 );

Теперь я попытался запросить данные, как показано ниже

select * from mykeyspace.mytable where field1='filter1' and field2='filter2' allow filtering;

После do c при использовании множественного индекса Я не могу определить, используется ли индекс, созданный мной выше, или нет? Любые указатели или объяснения были бы действительно полезны.

1 Ответ

1 голос
/ 09 июля 2020

Когда вы создаете вторичный индекс в Cassandra, Cassandra по существу создает соответствующую скрытую таблицу для него.

Итак, в вашем случае у вас будет 3 скрытых таблицы

CREATE TABLE field1_index(
    field1 text,
    key integer
    PRIMARY KEY ((field1), key) );   

CREATE TABLE field2_index(
    field2 text,
    key integer
    PRIMARY KEY ((field2), key) );   

CREATE TABLE field3_index(
    field3 text,
    key integer
    PRIMARY KEY ((field3), key) );

Эти таблицы являются локальными для узла, поэтому индексируются только данные, хранящиеся в этом конкретном узле.

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

Таким образом, для выполнения запроса может использоваться только один индекс, а остальные индексы фильтруются нормально. Вы можете видеть это, наблюдая

Эти запросы не требуют разрешающей фильтрации

select * from mykeyspace.mytable where field1='filter1';
select * from mykeyspace.mytable where field2='filter2';

Но запрос, имеющий оба индекса, делает

select * from mykeyspace.mytable where field1='filter1' and field2='filter2' allow filtering;

Это - хорошая статья, в которой обсуждается то же самое. Кроме того, любой ответ о вторичном индексе не будет полным без упоминания о том, что всегда используйте вторичный индекс вместе с ключом раздела для максимальной эффективности.

...