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

Can an index be created on a UUID Column?

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

我有一个 table 这样的:

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 没有抛出任何错误。

我在table:

中有一小部分测试数据
 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 刚刚 returns: (0 rows)

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

是的,您可以在 UUID 上创建二级索引。真正的问题是"should you?"

无论如何,我按照您的步骤进行了操作,并且成功了。

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 Whosebug ;
aploetz@cqlsh:Whosebug> 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:Whosebug> create index idx on some_data (run_id) ;
aploetz@cqlsh:Whosebug> INSERT INTO some_data (site_id, user_id, run_id, value) VALUES (1,1,9e118af0-ac92-11e4-81ae-8d1bc921f26d,3);
aploetz@cqlsh:Whosebug> select * from usr_rec3 where run_id = 9e118af0-ac92-11e4-81ae-8d1bc921f26d;
code=2200 [Invalid query] message="unconfigured columnfamily usr_rec3"
aploetz@cqlsh:Whosebug> 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 转 select 吗?

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

澄清:

  • 一般来说,使用二级索引并不是好的做法。在新书 Cassandra High Availability 中,罗比·斯特里克兰 (Robbie Strickland) 将它们的使用确定为反模式,因为性能不佳。
  • 仅仅因为列是 UUID 数据类型并不一定使它成为高基数。这对您来说更像是一个数据模型问题。但是了解 UUID 的性质及其实现唯一性的潜在目的,会引发危险信号。
  • 将这两点放在一起,在 UUID 上创建索引并没有什么吸引我的地方。如果是我的集群,而且(更重要的是)我以后要支持它,我不会做。