本文用到的cassandra的版本是2.0.6版
1、前提和约束
1 2 | CREATE TABLE test(a INT,b INT,c INT, d string,e string,PRIMARY KEY(a,b,c)); CREATE INDEX ON test(d); |
cassandra的查询具有以下约束:
第一主键 只能用=号查询
第二主键 支持= > < >= <= 但是必须后面加 ALLOW FILTERING
索引列 只支持=号
2、分页查询
首先使用limit 关键字来限制查询结果的条数 进行分页。
进行翻页是个比较复杂的过程。
需要明确查询出来的结果是按token(a) 来排序的,其次是按(b,c)来排序的。
假设无任何查询条件的查询,第一次查询语句是
1 | SELECT * FROM test LIMIT 10; |
出来的第10条记录的主键需要记录下来,假设为
a10 b10 c10
那么进行第二次查询的时候,语句应该这样写:
1 | SELECT * FROM test WHERE token(a)=token(a10) AND (b,c)>(b10,c10) LIMIT 10; |
假设查出来只有6条,
那么需要继续查出来4条,语句应该这样写:
1 | select * from test where token(a)>token(a10) limit 4; |
如果后面扔有数据,第20条记录的主键也要记录下来,假设为
a20 b20 c20
假设要继续翻页,重复第二次查询的过程即可。
3、总结
cassandra 的分页查询,主要是通过查询结果的默认的排列顺序来实现的,本文的例子是没有查询条件的情况,
有查询条件的情况,也是一样的。你只要知道了cassandra的默认查询结果的排序规则,就知道如何具体的分页查询了。
除非注明,赵岩的博客文章均为原创,转载请以链接形式标明本文地址
本文地址:https://zhaoyanblog.com/archives/164.html
经过测试,现在2.2.7的版本并没有限制主键只能用 ‘=’ 约束。
主键是可以用 > 约束的
大概这样的表结构
CREATE TABLE IF NOT EXISTS test(
id varchar,
state int,
createtime timestamp,
age int
PRIMARY KEY (id,createtime)
);
查询需求:指定id,state=1,的数据按createtime排序,分页。
请问应该怎么去处理?
state不是主键,无法查询。
如果把state设为第二主键呢?这样合理不?