cassandra——可以预料的查询,如果你的查询条件有一个是根据索引查询,那其它非索引非主键字段,可以通过加一个ALLOW FILTERING来过滤实现

简介:

cassandra的索引查询和排序

cassandra的索引查询和排序

cassandra的查询虽然很弱,但是它也是支持索引和排序的,当然是简陋的查询,这一切都是为了追求性能的代价,所以要使用cassandra,你不能希望它完全适用你的逻辑,而是把你的逻辑设计的更适合cassandra。

第一:索引查询
cassandra是支持创建二级索引的,索引可以创建在除了第一个主键之外所有的列上,当然有些类型除外,例如集合类型。
例如

1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE test(
	a INT,
	b INT,
	c INT,
	d INT,
	e INT,
	m INT,
	PRIMARY KEY(a,b,c));
 
CREATE INDEX ON test(c);
CREATE INDEX ON test(e);

在第一主键a上创建索引是不可以的:

1
CREATE INDEX ON test(a) X

索引列只可以用=号查询,所以

1
2
SELECT * FROM test WHERE e=1; //是可以
SELECT * FROM test WHERE e>1; //就不行了。

如果你的查询条件里,有一个是根据索引查询,那其它非索引非主键字段,可以通过加一个ALLOW FILTERING来过滤实现
例如:

1
SELECT * FROM test WHERE e=1 AND m>2 ALLOW FILTERING;

虽然m字段是非索引非主键字段,但是只要加了ALLOW FILTERING条件,它会先根据e=1查出来,再对结果进行m>2过滤

第二:排序
cassandra也是支持排序的,order by。 当然它的排序也是有条件的
第一:必须有第一主键的=号查询。cassandra的第一主键是决定记录分布在哪台机器上,也就是说cassandra只支持单台机器上的记录排序。
第二:那就是只能根据第二、三、四…主键进行有序的,相同的排序。
第三:不能有索引查询

1
2
3
4
SELECT * FROM test WHERE a=1 ORDER BY b DESC;
SELECT * FROM test WHERE a=1 ORDER BY b DESC, c DESC;
SELECT * FROM test WHERE a=1 ORDER BY b ASC;
SELECT * FROM test WHERE a=1 ORDER BY b ASC, c ASC;

以上都是可以的。

1
2
3
4
SELECT * FROM test ORDER BY b DESC; //没有第一主键 不行
SELECT * FROM test WHERE a=1 ORDER BY c DESC; //必须以第二主键开始排序
SELECT * FROM test WHERE a=1 ORDER BY b DESC, c ASC; //不是相同的排序。
SELECT * FROM test WHERE e=1 ORDER BY b DESC; //不能有索引。

其实cassandra的任何查询,最后的结果都是有序的,默认的是b asc, c asc,因为它内部就是这样存储的。
这个我在《cassandra2.0 如何实现分页查询》文章中提到过。所以你使用b desc, c asc 或者b asc,c desc 去排序,cassandra是比较为难的。
当然这个默认存储排序方式,是可以在建表的时候指定的。

1
2
3
4
5
6
7
8
9
CREATE TABLE test(
	a INT,
	b INT,
	c INT,
	d INT,
	e INT,
	m INT,
	PRIMARY KEY(a,b,c))
WITH CLUSTERING ORDER BY (b DESC, c ASC);
相关文章
|
8月前
|
存储 关系型数据库 索引
10. 在一个非主键字段上创建了索引, 想要根据该字段查询到数据, 需要查询几次 ?
在非主键字段上创建索引,查询数据通常需两次。对于MyISAM,先通过索引找到数据行指针,再获取数据;而InnoDB则先找主键ID,再从主键索引中查找数据。
50 0
|
4月前
|
存储 关系型数据库 MySQL
MySQL高级篇——覆盖索引、前缀索引、索引下推、SQL优化、主键设计
覆盖索引、前缀索引、索引下推、SQL优化、EXISTS 和 IN 的区分、建议COUNT(*)或COUNT(1)、建议SELECT(字段)而不是SELECT(*)、LIMIT 1 对优化的影响、多使用COMMIT、主键设计、自增主键的缺点、淘宝订单号的主键设计、MySQL 8.0改造UUID为有序
|
7月前
|
索引
Elasticsearch 精确查询:术语查询、多术语查询、主键查询、范围查询、存在查询、前缀查询、正则查询与通配符查询
Elasticsearch 精确查询:术语查询、多术语查询、主键查询、范围查询、存在查询、前缀查询、正则查询与通配符查询
|
7月前
|
SQL 关系型数据库 MySQL
MySQL数据库——索引(6)-索引使用(覆盖索引与回表查询,前缀索引,单列索引与联合索引 )、索引设计原则、索引总结
MySQL数据库——索引(6)-索引使用(覆盖索引与回表查询,前缀索引,单列索引与联合索引 )、索引设计原则、索引总结
180 1
|
7月前
|
SQL 关系型数据库 MySQL
MySQL数据库——索引(5)-索引使用(上),验证索引效率、最左前缀法则、范围查询、索引失效情况、SQL提示
MySQL数据库——索引(5)-索引使用(上),验证索引效率、最左前缀法则、范围查询、索引失效情况、SQL提示
117 0
|
SQL 存储 关系型数据库
为什么SQL语句命中索引比不命中索引要快?
有位粉丝面试高开的时候被问到,为什么SQL语句命中索引比不命中索引要快?虽然自己也知道答案,但被问到的瞬间,就不知道如何组织语言了。今天,我给大家深度分析一下。
104 0
|
存储 关系型数据库 MySQL
MySQL中什么是什么是主键索引、联合索引、覆盖索引、索引条件下推及区别
主键索引:它是一种特殊的唯一索引,不允许有空值,一般在建表的时候指定主键,就会创建主键索引,CREATE INDEX不能用来创建主键索引,通常使用ALTER TABLE来代替。
185 0
|
关系型数据库 MySQL 数据库
MySQL数据库基础学习Day2:条件查询,排序、限制和去重操作,聚合查询,分组查询2
MySQL数据库基础学习Day2:条件查询,排序、限制和去重操作,聚合查询,分组查询
124 0
MySQL数据库基础学习Day2:条件查询,排序、限制和去重操作,聚合查询,分组查询2
|
关系型数据库 MySQL 数据库
MySQL数据库基础学习Day2:条件查询,排序、限制和去重操作,聚合查询,分组查询
MySQL数据库基础学习Day2:条件查询,排序、限制和去重操作,聚合查询,分组查询
146 0
MySQL数据库基础学习Day2:条件查询,排序、限制和去重操作,聚合查询,分组查询
|
SQL 算法 数据库
数据库查询索引(sql单个索引和复合索引)
数据库查询索引(sql单个索引和复合索引)http://www.bieryun.com/3380.html 当一条sql语句的查询涉及到多个字段,这个时候给每个字段加索引,数据库也只能够使用其中的一个索引,这个时候使用复合索引就比较好了。
1118 0