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

ege*_*ard 2 cql cassandra 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));
Run Code Online (Sandbox Code Playgroud)

我用这个命令创建一个索引:

create index idx on some_data (run_id) ;
Run Code Online (Sandbox Code Playgroud)

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

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

 site_id | user_id | run_id                               | value
---------+---------+--------------------------------------+-----------------
       1 |       1 | 9e118af0-ac92-11e4-81ae-8d1bc921f26d |               3
Run Code Online (Sandbox Code Playgroud)

但是,当我运行查询时:

select * from some_data where run_id = 9e118af0-ac92-11e4-81ae-8d1bc921f26d
Run Code Online (Sandbox Code Playgroud)

CQLSH只返回: (0 rows)

如果我使用a int,run_id则索引的行为与预期一致.

Aar*_*ron 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)
Run Code Online (Sandbox Code Playgroud)

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

select * from usr_rec3 where run_id = 9e118af0-ac92-11e4-81ae-8d1bc921f26d
Run Code Online (Sandbox Code Playgroud)

你确定你不是故意选择some_data吗?

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

澄清:

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