Cassandra:查询where子句,其中包含greather-或小于(<;和>;)
我正在使用Cassandra 1.1.2,我正在尝试将RDBMS应用程序转换为Cassandra。在我的RDBMS应用程序中,我有一个名为table1的表:Cassandra:查询where子句,其中包含greather-或小于(<;和>;),cassandra,where-clause,cql,Cassandra,Where Clause,Cql,我正在使用Cassandra 1.1.2,我正在尝试将RDBMS应用程序转换为Cassandra。在我的RDBMS应用程序中,我有一个名为table1的表: | Col1 | Col2 | Col3 | Col4 | Col1:字符串(主键) Col2:字符串(主键) Col3:Bigint(索引) Col4:Bigint 这个表统计了超过2亿条记录。最常用的查询类似于: Select * from table where col3 < 100 and col3 > 50; 我将
| Col1 | Col2 | Col3 | Col4 |
Select * from table where col3 < 100 and col3 > 50;
我将主键更改为一个额外的列(我在应用程序中计算键)。
导入一些记录后,我尝试执行以下cql:
select * from table1 where col3 < 100 and col3 > 50;
查询从col3=67的表1中选择col1、col2、col3、col4
谷歌表示,没有办法执行这种查询。是这样吗?有没有关于如何创建这样一个查询的建议?Cassandra索引实际上不支持顺序访问;请参阅,以快速了解它们的用途。但不要绝望;使用Cassandra(和许多其他NoSQL系统)的更经典的方法是去规范化,去规范化,去规范化 在您的情况下,使用经典的bucket range模式可能是一个好主意,它允许您使用推荐的RandomPartitioner,并使行在集群中均匀分布,同时仍然允许顺序访问值。本例中的想法是,将第二个动态列族映射(带扣和有序)
col3
值映射回相关的primary_键
值。例如,如果您的col3
值范围为0到10^9,并且分布相当均匀,您可能希望将它们放在1000个范围为10^6的存储桶中(最佳粒度级别将取决于您需要的查询类型、数据类型、查询往返时间等)。cql3的模式示例:
CREATE TABLE indexotron (
rangestart int,
col3val int,
table1key varchar,
PRIMARY KEY (rangestart, col3val, table1key)
);
当插入到表1
中时,应在indexotron
中插入相应的行,并使用rangestart=int(col3val/1000000)
。然后,当您需要使用col3>X枚举table1
中的所有行时,您需要查询多达1000个indexotron
存储桶,但将对其中的所有col3val
进行排序。查找所有表1.col3<4021
的主键
值的示例查询:
SELECT * FROM indexotron WHERE rangestart = 0 ORDER BY col3val;
SELECT * FROM indexotron WHERE rangestart = 1000 ORDER BY col3val;
SELECT * FROM indexotron WHERE rangestart = 2000 ORDER BY col3val;
SELECT * FROM indexotron WHERE rangestart = 3000 ORDER BY col3val;
SELECT * FROM indexotron WHERE rangestart = 4000 AND col3val < 4021 ORDER BY col3val;
从indexotron中选择*,其中rangestart=0按col3val排序;
从indexotron中选择*,其中rangestart=1000 ORDER BY col3val;
从indexotron中选择*,其中rangestart=2000 ORDER BY col3val;
从indexotron中选择*,其中rangestart=3000 ORDER BY col3val;
从indexotron中选择*,其中rangestart=4000,col3val<4021,按col3val排序;
如果col3始终是已知的小值/范围,则您可以使用一个更简单的表,该表也映射回初始表,例如:
create table table2 (col3val int, table1key varchar,
primary key (col3val, table1key));
和使用
insert into table2 (col3val, table1key) values (55, 'foreign_key');
insert into table2 (col3val, table1key) values (55, 'foreign_key3');
select * from table2 where col3val = 51;
select * from table2 where col3val = 52;
...
或
如果你没有太大的射程,也许可以。(您也可以使用二级索引获得相同的效果,但二级索引并不被强烈推荐?)。理论上它也可以“在客户端本地”
“Cassandra方法”似乎是有一些像“userid”这样的键,您使用它作为“所有查询”的第一部分,因此您可能需要重新考虑您的数据模型,然后您可以有像表1中的select*这样的查询,其中userid='X'和col3val>3
,它可以(假设col3val上有一个集群键)
create table table2 (col3val int, table1key varchar,
primary key (col3val, table1key));
insert into table2 (col3val, table1key) values (55, 'foreign_key');
insert into table2 (col3val, table1key) values (55, 'foreign_key3');
select * from table2 where col3val = 51;
select * from table2 where col3val = 52;
...
select * from table2 where col3val in (51, 52, ...);