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