Запрос Cassandra slow SELECT MAX (x)

#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 не поддерживает транзакции, она просто гарантирует атомарность на уровне строк. Например, если вы запустите пару обновлений, в случае сбоя одного из них все предыдущие операции будут записаны без возможного отката.