#cassandra #cql #cql3
#cassandra #cql #cql3
Вопрос:
У меня есть компьютер разработчика с Cassandra 3.9 и 2 таблицами, в одной ~~ 400 000 записей, в другой около 40 000 000 записей. Их структуры различны.
У каждого из них есть дополнительный индекс в поле x, и я пытаюсь выполнить запрос формы SELECT MAX(x) FROM table
. Для первой таблицы запрос занимает пару секунд, а для второй таблицы время ожидания истекает.
Мой опыт работы с реляционными базами данных, где эти запросы являются тривиальными и быстрыми. Итак, в Cassandra похоже, что индекс не используется для выполнения этих запросов? Есть ли альтернатива?
Ответ №1:
В cassandra такие функции агрегирования, как MIN
, MAX
, COUNT
SUM
или AVG
, для таблицы без указания ключа раздела являются плохой практикой. вместо этого у вас может быть другая таблица, в которой хранится максимальное значение поля x для обеих таблиц.
Однако вам необходимо добавить некоторую логику на стороне клиента, чтобы поддерживать это максимальное значение в другой таблице при выполнении инструкций INSERT
or UPDATE
.
Структуры таблиц :
CREATE TABLE t1 (
pk text PRIMARY KEY,
x int
);
CREATE TABLE t2 (
pk text PRIMARY KEY,
x int
);
CREATE TABLE agg_table (
table_name text PRIMARY KEY,
max_value int
);
Таким образом, с помощью этой структуры вы можете получить максимальное значение для таблицы :
SELECT max_value
FROM agg_table
WHERE table_name = 't1';
Надеюсь, это может вам помочь.
Комментарии:
1. Должен ли я просто забыть о транзакциях и атомарности с Cassandra? 🙂
2. Cassandra не поддерживает транзакции, она просто гарантирует атомарность на уровне строк. Например, если вы запустите пару обновлений, в случае сбоя одного из них все предыдущие операции будут записаны без возможного отката.