是否可以在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
,那么索引就会按预期运行。
答案 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
进行查询,那么您应该重新访问数据模型,并提供适当的查询表来提供服务。
<强>澄清:强>