Кассандра - запрос на кластеризацию ключей
Я только начинаю на 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.