Запрос IN по вторичному индексу в cassandra, когда указан ключ раздела - PullRequest
0 голосов
/ 06 апреля 2020

Я работаю с системой, которая использует вторичный индекс в cassandra вместе с составным первичным ключом, например,

CREATE TABLE table (
  a bigint,
  b bigint,
  c bigint,
  PRIMARY KEY (a, b, c)
) WITH CLUSTERING ORDER BY (b ASC, c ASC)
CREATE INDEX secondary_index ON table (c);

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

select * from table where a = ? and c = ?;

Однако я заметил, что рабочая нагрузка системы такова, что большая часть В то время, когда ключи разделов в запрошенных строках существенно перекрываются, иногда более половины из них имеют один и тот же ключ раздела. Итак, я подумал, что может быть более эффективно выполнять один запрос на ключ раздела, с предложением IN для вторичного ключа, уменьшая количество общих запросов до однозначных в большинстве случаев и уменьшая накладные расходы на запросы чтения в кластере.

Однако, по крайней мере, выполненный из cql sh, это, по-видимому, недопустимо:

select * from table where a = ? and c in (...);
InvalidRequest: Error from server: code=2200 [Invalid query] message="PRIMARY KEY column "c" cannot be restricted as preceding column "b" is not restricted"

Разве это просто запрещено, и мне придется продолжать делать отдельные запросы? Есть ли какая-то причина, по которой она не будет более эффективной? Или это всего лишь ограничение CQL, и запросы IN не могут использовать вторичный индекс? Возможно, есть проблема, потому что вторичный индексный ключ также находится в первичном ключе, и Кассандра пытается использовать его вместо вторичного индекса?

...