можете ли вы порекомендовать какую-либо альтернативу для оператора IN в Кассандре для моих целей?
Помните, что по-прежнему возможно использовать оператор IN
для ключа раздела.Он не сказал бы, что рекомендуется , но это должно быть хорошо с небольшим количеством параметров.Во-первых, вам придется перестроить таблицу или создать новую таблицу для поддержки этого запроса.
Поскольку я не знаю вашего точного определения таблицы, я собираюсь сделать некоторые предположения (например, abc_id
).
Если вы воссоздали свою таблицу примерно так:
CREATE TABLE abc_by_domain (
domain TEXT,
abc_id TEXT,
value TEXT,
PRIMARY KEY (domain,abc_id));
Теперь запишите в нее некоторые данные, и тогда это сработает:
SELECT * FROM abc_by_domain WHERE domain IN ('domain1','domain2');
domain | abc_id | value
---------+--------+---------
domain1 | 1 | 1st row
domain2 | 2 | 2nd row
(2 rows)
Примечания:
- Я предположил, что текущий единственный первичный ключ равен
abc_id
.По сути, я сделал ключ кластеризации, чтобы гарантировать, что базовые строки, теперь разделенные по доменам, будут по-прежнему уникальными.В вашем случае возьмите любой ключевой столбец, обеспечивающий уникальность в таблице abc
, и используйте его в качестве ключа кластеризации для достижения той же цели. - Согласно моему предупреждению выше, это называется "ключевой запрос ", который является анти-паттерном в Кассандре.Проблема в том, что Cassandra не может гарантировать, что данные двух разделов будут находиться на одном и том же узле, поэтому она, по сути, выбирает координатора и выполняет два запроса за кулисами.По двум параметрам это, наверное, не так уж плохо.Но я бы постарался сохранить это в однозначных числах.