cassandra的索引查询和排序

转自:http://zhaoyanblog.com/archives/499.html
 

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);

除非注明,赵岩的博客文章均为原创,转载请以链接形式标明本文地址
本文地址:http://zhaoyanblog.com/archives/499.html

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

  1. 【mybatis】mybatis自定义动态字段查询,mybatis实现动态字段查询,如果某个条件为null,则不查询某个字段,否则就查询某个字段

    mybatis实现动态字段查询,如果某个条件为null,则不查询某个字段,否则就查询某个字段 先看一下 怎么实现动态的自定义字段查询: 例如: 而field 就是数据表中的某一个字段 String f ...

  2. mybatis由浅入深day01_4.7根据用户名称模糊查询用户信息_4.8添加用户((非)自增主键返回)

    4.7 根据用户名称模糊查询用户信息 4.7.1 映射文件 使用User.xml,添加根据用户名称模糊查询用户信息的sql语句. 4.7.2 程序代码 控制台: 4.8 添加用户 4.8.1 映射文件 ...

  3. [转载]要提高SQL查询效率where语句条件的先后次序应如何写

    出处:https://www.cnblogs.com/exe19/p/5786806.html 我们要做到不但会写SQL,还要做到写出性能优良的SQL语句. (1)选择最有效率的表名顺序(只在基于规则 ...

  4. 要提高SQL查询效率where语句条件的先后次序应如何写

    我们要做到不但会写SQL,还要做到写出性能优良的SQL语句. (1)选择最有效率的表名顺序(只在基于规则的优化器中有效): Oracle的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句 ...

  5. Spring Boot2(十一):Mybatis使用总结(自增长、多条件、批量操作、多表查询等等)

    一.前言 上次用Mybatis还是2017年做项目的时候,已经很久过去了.中途再没有用过Mybatis.导致现在学习SpringBoot过程中遇到一些Mybatis的问题,以此做出总结(XML极简模式 ...

  6. Oracle提高SQL查询效率where语句条件的先后次序

    (1)选择最有效率的表名顺序(只在基于规则的优化器中有效): Oracle的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处 ...

  7. Mysql 索引原理《一》索引原理与慢查询1

    为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句的优化显然 ...

  8. DQL---连接查询(内连接、外连接)、子查询、分页查询

    一.连接查询 1.连接查询建立在有相互关系的两个表间,进行两个及两个以上的表或视图的查询. 2.对n张表进行查询,至少需要n-1个连接表的条件. 二.笛卡尔积(容易造成数据库宕机) 1.指表中每行元素 ...

  9. Oracle查询一个命名空间下所有表和视图的表名、字段名、字段类型、字段大小,是否可为NULL,主键和注释信息

    使用SQL查询Oracle一个命名空间下所有表和视图的表名.字段名.字段类型.字段大小,是否可为NULL,主键和注释信息. SQL如下,注意需要将'CDFLOOD'更换为您要查询的命名空间: sele ...

随机推荐

  1. C# 异常捕获机制(Try Catch Finally)

    一.C#的异常处理所用到关键字 try 用于检查发生的异常,并帮助发送任何可能的异常. catch 以控制权更大的方式处理错误,可以有多个catch子句. finally 无论是否引发了异常,fina ...

  2. js插入拼接链接 --包含可变字段

    // newsId: 传参过来的Id, pathIdlet newsDetailId = parseInt(this.props.newsId); goTo() { window.location.h ...

  3. PCA和LDA

    一.PCA     在讲PCA之前,首先有人要问了,为什么我们要使用PCA,PCA到底是干什么的?这里先做一个小小的解释,举个例子:在人脸识别工作中一张人脸图像是60*60=3600维,要处理这样的数 ...

  4. .net打包/c#winfrom程序打包

    1:新建安装部署项目 打开VS,点击新建项目,选择:其他项目类型->安装与部署->安装向导(安装项目也一样),然后点击确定.(详细见下图) 此主题相关图片如下: 2:安装向导 关闭后打开安 ...

  5. Pomelo术语解释

    gate服务器 一个应用的gate服务器,一般不参与rpc调用,也就是说其配置项里可以没有port字段,仅仅有clientPort字段,它的作用是做前端的负载均衡.客户端往往首先向gate服务器发出请 ...

  6. OC的内存管理(二)ARC

    指针: 指向内存的地址指针变量 存放地址的变量指针变量值 变量中存放的值(地址值)指针变量指向的内存单元值 内存地址指向的值1):强指针:默认的情况下,所有的指针都是强指针,关键字strong ):弱 ...

  7. Spark2.2 saveAsTable 函数使用 overWrite 设置 Partition 会造成全覆盖的问题

    在使用 CDH 6.0.X 的版本还是自带的是 Spark2.2 的版本,2.2 版本的 Spark 使用 saveAsTable 如果使用overWrite PartitionBy 的功能会有和 h ...

  8. HttpServletResponse ServletResponse 返回响应 设置响应头设置响应正文体 重定向 常用方法 如何重定向 响应编码 响应乱码

    HttpServletResponse  和 ServletResponse  都是接口 具体的类型对象是由Servlet容器传递过来   ServletResponse对象的功能分为以下四种:   ...

  9. cocos2d-x android工程接入第三方支付宝SDK

    1. 首先去支付宝官网下载开发者文档 2. 然后按着开发者文档将支付宝的sdk导入到你的工程中,并关联到工程中,步骤入下图: (1)将从支付宝官方网站获得的支付宝的sdk的jar包拷贝到工程中的lib ...

  10. Web性能优化系列(1):Web性能优化分析

    本文由 伯乐在线 - 鸭梨山大 翻译,sunbiaobiao 校稿.未经许可,禁止转载!英文出处:gokulkrishh.github.io.欢迎加入翻译小组. 如果你的网站在1000ms内加载完成, ...