对timeuuid类型的查询不会通过cql返回正确的结果

时间:2014-12-29 21:08:59

标签: cassandra cql

我正在尝试使用timeuuid执行查询来检索结果集。

表就是这样:

CREATE TABLE mds.arguments_by_id (
  argument_id timeuuid PRIMARY KEY,
  category text,
  title text
)

当我为表中的所有数据选择dateOf()时,我得到以下内容:

select dateOf(argument_id),argument_id from arguments_by_id ;

 dateOf(argument_id)      | argument_id
 -------------------------+--------------------------------------
 2014-12-29 13:50:07-0500 | 81f990c0-8f8b-11e4-abb3-5d7a44c0d8a8
 2014-12-29 14:01:43-0500 | 20def1c0-8f8d-11e4-abb3-5d7a44c0d8a8
 2014-12-29 14:01:58-0500 | 29b50f50-8f8d-11e4-abb3-5d7a44c0d8a8
 2014-12-29 14:03:01-0500 | 4f6b72c0-8f8d-11e4-bc90-abc65998337a

(4 rows)

我想要运行的查询需要返回argument_id(date)大于指定日期的结果:

select dateOf(argument_id),argument_id from arguments_by_id where token(argument_id) > token(maxTimeuuid('2014-12-28 15:31:00-0500'));

然而,与上一个select:

相比,该查询返回(看似)不完整的结果集
 dateOf(argument_id)      | argument_id
--------------------------+--------------------------------------
 2014-12-29 14:01:43-0500 | 20def1c0-8f8d-11e4-abb3-5d7a44c0d8a8
 2014-12-29 14:01:58-0500 | 29b50f50-8f8d-11e4-abb3-5d7a44c0d8a8
 2014-12-29 14:03:01-0500 | 4f6b72c0-8f8d-11e4-bc90-abc65998337a

(3 rows)

我的目标是最小化密钥的数量 - 但我想知道我是否1)通过走这条路线会导致性能损失,2)尝试用主键做太多。

1 个答案:

答案 0 :(得分:2)

为了使用这样的timeuuid列,您需要将其设为聚类列而不是分区键(docs)。您需要对其进行调整以适合您的数据模型,但这是一个示例:

create table sample (
  id int,
  tid timeuuid,
  category text,
  title text,
  primary key (id, tid)
);

现在我们可以在几秒钟内完成一些插入:

insert into sample (id, tid) values (100, now());
insert into sample (id, tid) values (100, now());
insert into sample (id, tid) values (100, now());
insert into sample (id, tid) values (100, now());

显示所有值:

select id,tid,dateOf(tid) from sample;

 id  | tid                                  | dateOf(tid)
-----+--------------------------------------+--------------------------
 100 | df4387a0-8fa8-11e4-bd3a-97fb52c7ef8c | 2014-12-29 14:20:19-0800
 100 | e085a490-8fa8-11e4-bd3a-97fb52c7ef8c | 2014-12-29 14:20:21-0800
 100 | e2bd6c20-8fa8-11e4-bd3a-97fb52c7ef8c | 2014-12-29 14:20:24-0800
 100 | e475f190-8fa8-11e4-bd3a-97fb52c7ef8c | 2014-12-29 14:20:27-0800

使用timeuuid比较显示一部分:

select id,tid,dateOf(tid) from sample where id=100 and tid>=minTimeuuid('2014-12-29 14:20:24-0800');

 id  | tid                                  | dateOf(tid)
-----+--------------------------------------+--------------------------
 100 | e2bd6c20-8fa8-11e4-bd3a-97fb52c7ef8c | 2014-12-29 14:20:24-0800
 100 | e475f190-8fa8-11e4-bd3a-97fb52c7ef8c | 2014-12-29 14:20:27-0800

请注意,如果您在未指定主键(id = 100)的情况下尝试选择,则会收到警告,指出该查询需要允许过滤。这通常是错误的,因为它需要进行全表扫描:

select id,tid,dateOf(tid) from sample where tid>=minTimeuuid('2014-12-29 14:20:24-0800');
Bad Request: Cannot execute this query as it might involve data filtering and thus may have unpredictable performance. If you want to execute this 
query despite the performance unpredictability, use ALLOW FILTERING

这是另一个具有类似情况的SO answer