本文介绍cassandra支持的,目前我所知道的所有查询表达式类型。如果你需要更复杂的查询,单单依靠cassandra是很难做到的,你需要借助其它手段或者工具。
cassandra目前支持的表达式目前有三种:
我们先假设我们的表结构是这样的:
1 2 3 4 5 6 7 8 9 | CREATE TABLE test( a INT, b INT, c INT, d INT, e INT, PRIMARY KEY(a,b,c,d) ); CREATE INDEX ON test(e); |
1、前缀表达式
就是查询条件必须是主键,且前面的主键是=号,只有最后一个主键是> >= < <=。
举例:
1 2 3 4 | SELECT * FROM test WHERE a=1 AND b>2; SELECT * FROM test WHERE a=1 AND b=1 AND c>2; SELECT * FROM test WHERE a=1 AND b=1 AND c=1 AND d>2; SELECT * FROM test WHERE a=1 AND b=1 AND c>2 AND c<2; |
以上都是可行的。
1 2 3 4 5 6 | SELECT * FROM test WHERE a>1; //不行,第一主键只能用=号 SELECT * FROM test WHERE a=1 AND c>2; //不行 中间不能有跳跃 SELECT * FROM test WHERE a=1 AND b>2 AND b>=2; //不行,同一个主键不能同时用> >= = 或者< <= = |
2、不含第一主键的前缀表达式
这类表达式,需要加上ALLOW FILTERING来查询,这样的查询效率肯定是低一些
举例:
1 2 3 4 | SELECT * FROM test WHERE b>2 ALLOW FILTERING; SELECT * FROM test WHERE b=1 AND c>2 ALLOW FILTERING; SELECT * FROM test WHERE b=1 AND c=1 AND d>2 ALLOW FILTERING; SELECT * FROM test WHERE b=1 AND c>2 AND c<2 ALLOW FILTERING; |
3、包含索引列查询
举例:
1 2 3 4 5 6 7 8 9 | SELECT * FROM test WHERE e=1; //只含索引 SELECT * FROM test WHERE a=1 AND b=1 AND c>1 AND e=1; //包含索引列和前缀表达式的组合 SELECT * FROM test WHERE b=1 AND c>1 AND e=1; //包含索引列和不含第一主键的前缀表达式的组合 不需要ALLOW FILTERING SELECT * FROM test WHERE c>1 AND e=1 ALLOW FILTERING; //除此之外和任意其它表达式的组合,都可以进行查询, //前提是要加ALLOW FILTERING; |
最后说一下,cassandra查询出来的结果,无论什么查询结果,都是先按token(a)排序,再按b排序 再按c排序,再按d排序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | a | b | c | d | e ---+---+---+---+--- 13 | 2 | 3 | 4 | 5 1 | 2 | 1 | 4 | 5 1 | 2 | 3 | 1 | 5 1 | 2 | 3 | 2 | 5 1 | 2 | 3 | 4 | 5 1 | 2 | 3 | 7 | 5 1 | 2 | 6 | 4 | 5 1 | 3 | 2 | 4 | 5 1 | 4 | 3 | 7 | 5 1 | 7 | 3 | 7 | 5 2 | 2 | 3 | 4 | 5 21 | 2 | 3 | 4 | 5 |
这有助你进行分页查询
除非注明,赵岩的博客文章均为原创,转载请以链接形式标明本文地址
本文地址:https://zhaoyanblog.com/archives/265.html
学习了,博主。