Кассандра - запрос на кластеризацию ключей

Я только начинаю на Cassandra, и я пытался создать таблицы с разными ключами разделов и кластеров, чтобы увидеть, как их можно запрашивать по-разному.

Я создал таблицу с первичным ключом вида - (a),b,c, где a - ключ раздела, а b, c - ключ кластеризации.

При запросе я заметил, что следующий запрос:

select * from tablename where b=val;

результаты в:

Невозможно выполнить этот запрос, так как он может включать фильтрацию данных и, следовательно, может иметь непредсказуемую производительность. Если вы хотите выполнить этот запрос, несмотря на непредсказуемость производительности, используйте ALLOW FILTERING

И использование "ALLOW FILTERING" дает мне то, что я хочу (хотя я слышал, что это плохо для производительности).

Но когда я запускаю следующий запрос:

select * from tablename where c=val;

Это говорит:

Столбец PRIMARY KEY "c" не может быть ограничен (предыдущий столбец "b" либо не ограничен, либо не связан с EQ)

И вообще нет опции "РАЗРЕШИТЬ ФИЛЬТРОВКУ".

МОЙ ВОПРОС - Почему все ключи кластеризации не обрабатываются одинаково? Столбцу b, который примыкает к ключу раздела "a", предоставляется опция "разрешить фильтрацию", которая позволяет выполнять запросы к нему, в то время как запросы к столбцу "c" не кажутся вообще возможными (учитывая то, как эта таблица составлена).

ALLOW FILTERING заставляет кассандру сканировать все SSTables и извлекать из нее данные, когда ключ раздела отсутствует, тогда почему мы не можем сделать тот же столбец c?

1 ответ

Решение

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

Чтобы добавить к вашему примеру, предположим, PRIMARY KEY ((a),b,c,d), Вы можете выполнить свой запрос (с разрешить фильтрацию), просто указав b, или же b а также c, Но это не позволит вам указать c а также d (пропуская b) или же b а также d (пропуская c).

И как побочный узел, если вы действительно хотите иметь возможность запрашивать только b или только cЗатем вы должны поддержать эти запросы с помощью дополнительных таблиц, разработанных как таковые. ALLOW FILTERING - это пластырь, и это не то, что вы должны когда-либо делать в производственном развертывании Cassandra.

Другие вопросы по тегам