Я использую Cassandra 2.1 и есть модель, которая примерно выглядит следующим образом:Использование вторичных индексов для обновления строк в Cassandra 2.1
CREATE TABLE events (
client_id bigint,
bucket int,
timestamp timeuuid,
...
ticket_id bigint,
PRIMARY KEY ((client_id, bucket), timestamp)
);
CREATE INDEX events_ticket ON events(ticket_id);
Как вы можете видеть, я создал вторичный индекс по ticket_id
. Этот индекс работает нормально. events
содержит около 100 миллионов строк, в то время как только 5 миллионов из этих строк имеют около 50 000 отдельных билетов. Таким образом, билет - в среднем - имеет 100 событий.
Выполнение запроса вторичного индекса работает без предоставления ключа раздела, что удобно в нашей ситуации. Поскольку столбец bucket
иногда трудно определить заранее (т. Е. Вы должны знать дату событий, bucket
в настоящее время является датой).
cqlsh> select * from events where ticket_id = 123;
client_id | bucket | timestamp | ... | ticket_id
-----------+--------+-----------+-----+-----------
(0 rows)
Как решить проблему, когда все события билета должны быть перенесены в другой билет? То есть Следующий запрос не будет работать:
cqlsh> UPDATE events SET ticket_id = 321 WHERE ticket_id = 123;
InvalidRequest: code=2200 [Invalid query] message="Non PRIMARY KEY ticket_id found in where clause"
Означает ли это вторичные индексы не могут быть использованы в UPDATE
запросов?
Какую модель следует использовать для поддержки этих изменений?