Неверный запрос: нет индексированных столбцов, присутствующих в предложении by-columns с равным оператором: ошибка CQL?

у меня есть таблица ниже в CQL -

create table test (
    employee_id text,
    employee_name text,
    value text,
    last_modified_date timeuuid,
    primary key (employee_id)
   );

я вставил пару записей в приведенную выше таблицу, как это, которые я буду вставлять в наш фактический сценарий использования -

insert into test (employee_id, employee_name, value, last_modified_date) values ('1', 'e27',  'some_value', now());
insert into test (employee_id, employee_name, value, last_modified_date) values ('2', 'e27',  'some_new_value', now());
insert into test (employee_id, employee_name, value, last_modified_date) values ('3', 'e27',  'some_again_value', now());
insert into test (employee_id, employee_name, value, last_modified_date) values ('4', 'e28',  'some_values', now());
insert into test (employee_id, employee_name, value, last_modified_date) values ('5', 'e28',  'some_new_values', now());

теперь я делал select query for-дайте мне все employee_id для employee_name e27.

select employee_id from test where employee_name = 'e27';

и это ошибка, которую я получаю -

Bad Request: No indexed columns present in by-columns clause with Equal operator
Perhaps you meant to use CQL 2? Try using the -2 option when starting cqlsh.

есть ли что-то неправильное, что я здесь делаю?

мои варианты использования в целом -

  1. Дайте мне все для любого из employee_name?
  2. Дайте мне все, что изменилось за последние 5 минут?
  3. Дайте мне последний employee_id и значение для любого из employee_name?
  4. Дайте мне все employee_id для любого из employee_name?

я запускаю Кассандру 1.2.11

2 ответов


общее правило простое: "вы можете только запрос по столбцам, которые являются частью ключа". В качестве объяснения все другие запросы потребуют полного сканирования таблиц, что может означать много просеивания данных.

есть вещи, которые могут изменить это правило:

  1. использовать вторичные индексы для столбцов с низкой кардинальностью (подробнее...здесь)
  2. определение многоколонных ключей (например,PRIMARY KEY (col1, col2); что позволит такие запросы, как col1 = value1 и col1 = value1 and col2 COND)
  3. использовать ALLOW FILTERING в запросах. Это приведет к предупреждению, так как Кассандре придется просеять много данных, и не будет никаких гарантий производительности. Более подробную информацию см. подробности разрешить фильтрацию в CQL и это так нити

Кассандра немного привыкает:) некоторые из нас были испорчены некоторыми дополнительными вещами, которые RDBMS делает для вас, которые вы не получаете бесплатно от noSql.

Если вы вспомните обычную таблицу СУБД, если вы выберете столбец без индекса, БД должна выполнить сканирование всей таблицы, чтобы найти все совпадения, которые вы ищете. Это нет-нет в Кассандре, и он будет жаловаться, если вы попытаетесь это сделать. Представьте, что вы нашли 10^32 совпадений с этим запросом? Это не разумно просить.

в вашей таблице вы закодировали * первичный ключ (employee_id);* это первичный и уникальный идентификационный ключ строки. теперь вы можете выбрать * из теста, где employee_id= '123'; это вполне разумно и Кассандра с радостью возвращают результат.

ваш выберите из теста, где employee_name = 'e27'; говорит Кассандре пойти и прочитать каждую запись, пока она не найдет совпадение на "e27". Без индекса, на который можно положиться, он вежливо спрашивает вы сможете забыть это.

Если вы хотите отфильтровать столбец, убедитесь, что у вас есть индекс в этом столбце, чтобы Кассандра могла выполнить необходимую фильтрацию.