是否可以在 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
那么索引的行为就如预期的那样。
是的,您可以在 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
,那么您应该重新访问您的数据模型并提出一个适当的查询表来服务它。
澄清:
- 一般来说,使用二级索引不被认为是好的做法。在新书中卡桑德拉高可用性 https://rads.stackoverflow.com/amzn/click/com/1783989122,由于性能不佳,Robbie Strickland 将它们的使用视为反模式。
- 仅仅因为列属于 UUID 数据类型并不一定意味着它具有高基数。这对你来说更多是一个数据模型问题。但了解 UUID 的性质及其独特的潜在目的,就会引发危险信号。
- 将这两点放在一起,在 UUID 上创建索引听起来对我来说没有任何吸引力。如果是我的集群,并且(更重要的是)我以后必须支持它,我就不会这样做。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)