Cassandra Secondary Index 介绍
摘要
本文主要介绍cassandra中的索引,物化视图,有些知识点需要对cassandra有基本的认识才能理解。比如数据在cassandra节点中如何分布。如果有不明白的地方可以看本专栏之前文章。或者发送邮件和我探讨 cnstonefang@gmail.com。
为什么叫secondary index
CREATE TABLE user(
id bigint,
name text,
email text,
PRIMARY KEY(id)
);
在很多文档中可以看到cassandra index又被称为secondary index.这是相对primary index的概念。在创建上述user table 时,会根据primary key 默认创建 primary index,基于id 列。可以根据id来查询用户的信息。但是不同于关系型数据库。你没法根据email反向查id.为了实现这样的查询,可以基于email创建secondary index.
CREATE INDEX email_index ON user(email);
当你创建索引的时候,cassandra 会创建一个隐藏table来存储数据
CREATE TABLE email_index(
email text,
id bigint,
PARMARY KEY(text,id)
);
secondary index 的这张表的信息是local aware的。和节点的数据存放在一起。而primary index是global.所以当你根据primary index columns 来查询的时候,cassandra ring 环上的每个节点都是知道数据是存储在哪些节点上的。但是如果根据secondary index columns 来查询。cassandra ring 环上的所有节点都是不知道数据放在哪些节点上的。必须要查询所有的节点。这也是为什么很多人说cassandra secondary index的效率很低的原因。但是实际上cassandra是不是会这么去查询呢,当然不会这么简单粗暴。一个1000节点的cluster,如果都去查的话,查询的coordinator肯定撑不住了。
secondary index 查询
cassandra 首先要查询所有节点,对于每个节点,要进行本地查询。
本地查询:对于每个节点的本地查询,是比较简单明了的。根据secondary index columns值查询隐藏的index table,得到primary key,然后查询原表。
cluster 查询:对于所有节点查询,cassandra 基于partition keys实现了一套复杂的算法来优化范围扫描查询。当然这套算法不止针对于secondary index.适用于所有的范围扫描。
这套算法的基本点在于,循环查询。每一轮会根据CONCURRENCY_FACTOR 来决定有多少个节点会被查询,如果返回的数据不够。CONCURRENCT_FACTOR +1,直到返回的结果集够了。
注意cassandra是根据token range 来查询这些节点的,所以返回的结果集没有特定的顺序。
Notes
尽管cassandra对范围查询进行了优化,但是不可否认的是基于secondary index查询的效率还是比较低。最好的实践是在对secondary index查询时,能够带上primary index 条件。比如partition =xxx,partition in(xx,yy)或者token(partition)>= xxx AND token(partition)<=yyy
使用场合
适用于有很多行都有的某个列(cassandra不要求每一行都必须存所有的列),并且这列的值范围比较大。
另一方面,这些列不适合
1.经常更新,删除的列
cassandra 存储index 的墓碑有100K cells的限制,超过这个限制,基于index的column查询就会失败。
另外index的数据也是存在隐藏表里面的。如果经常更新删除这列数据,不仅要写主表,还要写隐藏表。
2.取值范围很低(low-cardinality)比如bool型
对这样的列做索引,没什么意义。index 表中只有两个partition了。如果主表数据很多的话,就会
每个partition就会很大。
3.取值范围很高(high-cardinality)比如上面的例子,一个id对应一个email.
如果对email做索引。那么当我们根据email查询时,就只有至多一个值了。最理想的情况,当我们
查询一个节点时,就恰好查到了。最糟糕的情况,得查询完所有的节点,才能查到。
看了2,3可能有些人很困惑,取值范围很低不适合index,取值范围很高也不适合index,有没有给出一个标准,什么
样的叫取值范围高,什么样的叫取值范围低。让我怎么去判断。其实在cassandra的很多地方都存在这样的问题,没有一个
非常严谨,准确的定义。需要使用者自己去平衡,根据实际的的表设计,数据分布去做性能分析,得出适合自己应用的表设计。
与物化视图,新表的区别
为了满足查询,cassandra经常需要创建新表,物化视图,索引来实现特点的查询。
索引的特点在上面已经提到了。新创建一张表会有数据冗余,但是在分布式存储系统中,这是完全可以接受的,相比较视图新表多了数据维护。但是有些情况视图和索引都解决不了,比如上面提的low-cardinality 情况,视图也没法解决。因为视图是global的,会造成hot-spot情况,及视图数据都只存在某些固定的节点。
另外视图的更新是异步更新的
对cassandra感兴趣的童鞋可以参入群(104822562)一起学习探讨
参考
http://www.planetcassandra.org/blog/cassandra-native-secondary-index-deep-dive/
https://docs.datastax.com/en/cql/3.3/cql/cql_using/useWhenIndex.html
http://www.datastax.com/dev/blog/materialized-view-performance-in-cassandra-3-x
Cassandra Secondary Index 介绍的更多相关文章
- 23.Secondary Index
一. Secondary Index(二级索引)1.1. Secondary Index 介绍 • Clustered Index(聚集索引) ◦ 叶子节点存储所有记录(all row data) • ...
- [20180608]Wrong Results with IOT, Added Column and Secondary Index.txt
[20180608]Wrong Results with IOT, Added Column and Secondary Index.txt --//链接:http://db-oriented.com ...
- cassandra 并发技术介绍
摘要 本文主要介绍cassandra线程技术,cassandra的实现是基于java的,所以线程技术使用的也是jdk包提供的线程类.cassandra是分布式数据库,整个并发架构是基于阶段事件驱动架构 ...
- PLSQL_性能优化索引Index介绍(概念)
2014-06-01 BaoXinjian
- Oracle索引(Index)介绍使用
1.什么是引 索引是建立在表的一列或多个列上的辅助对象,目的是加快访问表中的数据:Oracle存储索引的数据结构是B*树,位图索引也是如此,只不过是叶子节点不同B*数索引:索引由根节点.分支节点和叶子 ...
- 聚簇索引(clustered index )和非聚簇索引(secondary index)的区别
这两个名字虽然都叫做索引,但这并不是一种单独的索引类型,而是一种数据存储方式.对于聚簇索引存储来说,行数据和主键B+树存储在一起,辅助键B+树只存储辅助键和主键,主键和非主键B+树几乎是两种类型的树. ...
- Mongo Index
摘要 mongo 的索引非常强大,和关系型数据库索引没什么区别.这里主要介绍本人在mongo索引上的犯的错. 索引种类 1.单字段索引 2.复合索引 多个字段索引 如{name:1,address:1 ...
- cassandra 3.x官方文档(7)---内部原理之如何读写数据
写在前面 cassandra3.x官方文档的非官方翻译.翻译内容水平全依赖本人英文水平和对cassandra的理解.所以强烈建议阅读英文版cassandra 3.x 官方文档.此文档一半是翻译,一半是 ...
- Hadoop介绍-4.Hadoop中NameNode、DataNode、Secondary、NameNode、JobTracker TaskTracker
Hadoop是一个能够对大量数据进行分布式处理的软体框架,实现了Google的MapReduce编程模型和框架,能够把应用程式分割成许多的 小的工作单元,并把这些单元放到任何集群节点上执行.在MapR ...
随机推荐
- javax.el.ELException: Error reading [name] on type [com.news.entity.Topic_$$_javassist_1]异常
异常如下: 异常分析:从message中可以看出,错误是读取异常,属性是name,路径是com.news.entity.Topic,此错误是使用Hibernate时,由于Hibernate还没有去数据 ...
- 洛谷 P2590 [ZJOI2008]树的统计(树链剖分)
题目描述一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v ...
- 顺序或者说优先级的重要性---解决dom生成问题有感
我们的大脑有逻辑,程序也有逻辑,只要一切都刚刚好,那么我们大脑的逻辑和程序的逻辑是没有冲突的:但是,有时候,我们想当然,只顾自己头脑中的逻辑,而随意臆想程序的逻辑,这个时候,就会有很多我们觉得不可思议 ...
- [BZOJ 5093]图的价值
Description 题库链接 一个带标号的图的价值定义为每个点度数的 \(k\) 次方的和.给定 \(n\) 和 \(k\) ,请计算所有 \(n\) 个点的带标号的简单无向图的价值之和.对 \( ...
- BZOJ 3938 Robot
Description 小q有n只机器人,一开始他把机器人放在了一条数轴上,第i只机器人在ai的位置上静止,而自己站在原点.在这 之后小q会执行一些操作,他想要命令一个机器人向左或者向右移动x格.但是 ...
- 计蒜客NOIP模拟赛(3)D2T1 小区划分
一条街道的两侧各连续坐落着 N 座单元楼.现在要为这些单元楼划分居民校区. 规则如下: 每个小区只能由同一侧连续的若干座单元楼组成.且两侧都恰有 K 个小区(每个小区至少有一栋楼). 两侧的小区划分规 ...
- JSP 基本语法
1 JSP 的由来 servlet产生后,存在很大的问题,为了表现页面的效果,需要输出大量的HTML 语句,表现为一个个字符串,不仅利于开发,也不利于后期的维护,由此产生了JSP.主要用于将Servl ...
- 作为开发也要了解的 mysql 优化思路
作为开发人员,数据库知识掌握的可能不是很深入,但是一些基本的技能还是要有时间学习一下的.作为一个数据库菜鸟,厚着脸皮来总结一下 mysql 的基本的不能再基本的优化方法. 为了更好的说明,我假想出来了 ...
- Python Django rest framework
本节内容 Django rest framework 安装 Django rest framwwork 环境配置 简单举例说明 Django中使用 rest framework 1.1 安装 Djan ...
- 基于SSE4和多核编程的电子相册的实现
基于SSE4和多核编程的电子相册的实现 摘要:电子相册中前后两张图片的切换会产生淡入淡出效果,而且切换过程中需要大量的中间计算过程,而SSE4和多核编程技术能够有效加快中间的计算过程,有效减少图片 ...