可以在UUID列上创建索引吗?

时间:2015-02-04 17:45:38

标签: cassandra cql cassandra-2.0

是否可以在Cassandra的UUID / TIMEUUID列上创建索引?我正在测试一个模型设计,它会在UUID列上有一个索引,但是对该列的查询总是返回0行。

我有一张这样的表:

create table some_data (site_id int, user_id int, run_id uuid, value int, primary key((site_id, user_id), run_id));

我使用此命令创建索引:

create index idx on some_data (run_id) ;

创建此索引时,CQL不会抛出任何错误。

我在表格中有一小部分测试数据:

 site_id | user_id | run_id                               | value
---------+---------+--------------------------------------+-----------------
       1 |       1 | 9e118af0-ac92-11e4-81ae-8d1bc921f26d |               3

但是,当我运行查询时:

select * from some_data where run_id = 9e118af0-ac92-11e4-81ae-8d1bc921f26d

CQLSH只返回:(0 rows)

如果我对int使用run_id,那么索引就会按预期运行。

1 个答案:

答案 0 :(得分:6)

是的,您可以在UUID上创建辅助索引。真正的问题是"你应该吗?"

无论如何,我按照你的步骤,让它发挥作用。

Connected to Test Cluster at 192.168.23.129:9042.
[cqlsh 5.0.1 | Cassandra 2.1.2 | CQL spec 3.2.0 | Native protocol v3]
Use HELP for help.
aploetz@cqlsh> use stackoverflow ;
aploetz@cqlsh:stackoverflow> create table some_data (site_id int, user_id int, run_id uuid, value int, primary key((site_id, user_id), run_id));
aploetz@cqlsh:stackoverflow> create index idx on some_data (run_id) ;
aploetz@cqlsh:stackoverflow> INSERT INTO some_data (site_id, user_id, run_id, value) VALUES (1,1,9e118af0-ac92-11e4-81ae-8d1bc921f26d,3);
aploetz@cqlsh:stackoverflow> select * from usr_rec3 where run_id = 9e118af0-ac92-11e4-81ae-8d1bc921f26d;
code=2200 [Invalid query] message="unconfigured columnfamily usr_rec3"
aploetz@cqlsh:stackoverflow> select * from some_data where run_id = 9e118af0-ac92-11e4-81ae-8d1bc921f26d;

 site_id | user_id | run_id                               | value
---------+---------+--------------------------------------+-------
       1 |       1 | 9e118af0-ac92-11e4-81ae-8d1bc921f26d |     3

(1 rows)

请注意,当我运行此命令时,它失败了:

select * from usr_rec3 where run_id = 9e118af0-ac92-11e4-81ae-8d1bc921f26d

您确定自己并不想从some_data中选择吗?

此外,在高基数列(如UUID)上创建二级索引通常不是一个好主意。如果您需要按run_id进行查询,那么您应该重新访问数据模型,并提供适当的查询表来提供服务。

<强>澄清:

  • 一般使用二级索引不被视为良好做法。在新书Cassandra High Availability中,由于表现不佳,Robbie Strickland将其用作反模式。
  • 仅仅因为列属于UUID数据类型并不一定使其成为高基数。这对你来说更像是一个数据模型问题。但是,了解UUID的性质及其独特的潜在目的,正在引发危险信号。
  • 将这两点放在一起,并且没有任何关于在UUID上创建一个听起来很吸引人的索引的事情。如果它是我的集群,并且(更重要的是)我以后必须支持它,我就不会这样做。