可以在 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 上创建索引并没有什么吸引我的地方。如果是我的集群,而且(更重要的是)我以后要支持它,我不会做。
是否可以在 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 上创建索引并没有什么吸引我的地方。如果是我的集群,而且(更重要的是)我以后要支持它,我不会做。