我正在使用 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
包含大约 1 亿行,而其中只有 500 万行有大约 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
查询中使用?
我应该使用什么模型来支持这些更改?