如果(A, B) 是您的分区键,您将无法有效地进行该查询。您的密钥需要是 ((A), B)(删除集群密钥)。然后SELECT * FROM T WHERE A = ?。如果只关心最新的,那么 A、B 总是会被替换为最新的。
如果要从某个时间获取 A、B 元组,另一种选择是创建一个按时间索引的表,并让元组从那里聚集列,如 ((time_bucket), A, B, C)。 time_bucket 是一个类似于 2018-04-06:00:00:00 的字符串,其中包含当天的所有事件。然后当你像这样查询时:
> CREATE TABLE example (time_bucket text, A int, B int, C int, D int, PRIMARY KEY ((time_bucket), A, B, C)) WITH CLUSTERING ORDER BY (A ASC, B ASC, C DESC);
> INSERT INTO example (time_bucket, A, B, C, D) VALUES ('2018-04', 1, 1, 100, 999);
> INSERT INTO example (time_bucket, A, B, C, D) VALUES ('2018-04', 1, 1, 120, 999);
> INSERT INTO example (time_bucket, A, B, C, D) VALUES ('2018-04', 1, 1, 130, 999);
> INSERT INTO example (time_bucket, A, B, C, D) VALUES ('2018-04', 1, 2, 130, 999);
> SELECT * FROM example WHERE time_bucket = '2018-04' GROUP BY time_bucket, A, B;
time_bucket | a | b | c | d
-------------+---+---+-----+-----
2018-04 | 1 | 1 | 130 | 999
2018-04 | 1 | 2 | 130 | 999
您将从时间桶分区中由 A 和 B 聚类的每一行中获得第一个结果。如果您使分区足够小(使用更细粒度的时间桶,例如小时或 15 分钟或其他时间,具体取决于数据速率)在这里使用 ALLOW FILTERING 更容易接受,例如:
SELECT * FROM example WHERE time_bucket = '2018-04' AND A = 1 AND C < 120 GROUP BY time_bucket, A, B ALLOW FILTERING ;
time_bucket | a | b | c | d
-------------+---+---+-----+-----
2018-04 | 1 | 1 | 100 | 999
因为它全部在一个分区内并且在一个有界大小内(使用 tablestats/max partition size 密切监视它)。确保始终使用 time_bucket 进行查询,以免它成为范围查询。您要确保最终不会在没有返回结果的情况下经历太多事情(这是允许过滤的危险之一)。