摘要

本文主要介绍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时,不指定partition key,因为既要扫描所有的partition,每个patition里面还得全扫描,因此cassandra不允许这样的操作。创建了对应字段的secondary index后,如果不指定partition key,必须带上 ALLOW FILTERING,才能进行查询,但是不建议在生产环境中使用。

本地查询:对于每个节点的本地查询,是比较简单明了的。根据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

https://wiki.apache.org/cassandra/WritePathForUsers

Cassandra Secondary Index 介绍相关推荐

  1. 【华为云技术分享】GeminiDB for Cassandra 流功能介绍

    1      使用GeminiDB for Cassandra流捕获表活动 1.1      功能介绍 当存储在GeminiDB for Cassandra集群中某张表的某项目发生变更时,其他的程序能 ...

  2. 为什么需要Secondary Index

    对于HBase而言,如果想精确地定位到某行记录,唯一的办法是通过rowkey来查询.如果不通过rowkey来查找数据,就必须逐行地比较每一列的值,即全表扫瞄.对于较大的表,全表扫瞄的代价是不可接受的. ...

  3. MySQL · 引擎特性 · InnoDB Adaptive hash index介绍

    一 序 先看官网上的介绍(翻译来自MK提丰 ) The adaptive hash index (AHI) lets InnoDB perform more like an in-memory dat ...

  4. Apache Cassandra static column 介绍与实战

    假设我们有这样的场景:我们想在 Cassandra 中使用一张表记录用户基本信息(比如 email.密码等)以及用户状态更新.我们知道,用户的基本信息一般很少会变动,但是状态会经常变化,如果每次状态更 ...

  5. 华为hbase二级索引(secondary index)细节分析

    转载自:http://ju.outofmemory.cn/entry/50610 华为在HBTC 2012上由其高级技术经理Anoop Sam John透露了其二级索引方案,这在业界引起极大的反响,甚 ...

  6. Cassandra数据库介绍

    Cassandra 数据库,值得介绍的技术细节其实挺多的.因为它很多实现思路和关系型数据库或者其他的 NoSQL 数据库,是有一些不同的.这种不同是在数据库设计实现思路上也是根源上的.所以衍生开来的诸 ...

  7. 读过本文才算真正了解Cassandra数据库

    来自:DBAplus社群 作者介绍 宇文湛泉,现任金融行业核心业务系统DBA,主要涉及Oracle.DB2.Cassandra等数据库开发工作. Cassandra数据库,值得介绍的技术细节其实挺多的 ...

  8. 第六章: Cassandra架构--Cassandra:The Definitive Guide 2nd Edition

    在本章中,我们将研究Cassandra架构的几个方面,以了解它如何完成其工作. 我们将解释集群的拓扑结构,以及节点如何在对等设计中进行交互,以使用诸如八卦,反熵和暗示切换等技术来维护集群的健康状况并交 ...

  9. TIDB简介及TIDB部署、原理和使用介绍

    TiDB简介及TiDB部署.原理和使用介绍 从MySQL架构到TiDB 数据库分类 ​ 介绍TiDB数据库之前,先引入使用场景.如今的数据库种类繁多,RDBMS(关系型数据库).NoSQL(Not O ...

  10. cassandra的全文检索插件

    https://github.com/Stratio/cassandra-lucene-index Stratio's Cassandra Lucene Index Stratio's Cassand ...

最新文章

  1. 怎么检查python是否安装成功-如何在Docker中检查是否安装了python包?
  2. 二叉树最大宽度与leetcode662的二叉树最大宽度
  3. 使用 IntraWeb (13) - 基本控件之 TIWLabel、TIWLink、TIWURL、TIWURLWindow
  4. css固定在右中间位置,css布局,左右固定中间自适应实现
  5. postgresql_PostgreSQL开放自由
  6. java 消息队列服务_ActiveMQ 消息队列服务
  7. VB讲课笔记13:二级公共基础
  8. 解决python读取pickle报错ValueError: unsupported pickle protocol: 5
  9. 哑弹 图像处理检测_火箭军第三代哑弹处置系统排爆效率提升30%
  10. 拓端tecdat|R语言股市可视化相关矩阵:最小生成树
  11. [译]Chipmunk教程 - 5 跟踪球体的运动
  12. 图像处理中的差分求导计算和相应的卷积核(filter)
  13. 汇编语言王爽 实验第五章
  14. python 移动文件语句_python移动文件
  15. dell5580bios恢复出厂_戴尔笔记本bios如何恢复出厂设置
  16. Excel图表1——双坐标图(双柱图)
  17. Android service后台执行定时任务
  18. java.sql.SQLSyntaxErrorException: Table ‘H_PERSION‘ doesn‘t exist
  19. JAVA语言的介绍和特性
  20. Android系统 lk启动流程简析

热门文章

  1. 蓝宝石英语怎么读,sapphire是什么意思_sapphire的翻译_音标_读音_用法_例句_爱词霸在线词典...
  2. 网络统考计算机操作题分数占比,计算机一级office考试 word占多少分值?
  3. 苹果回应巴西政府禁止销售不附赠充电器的iPhone;小米造车新进展;国内首家以数据服务为核心的央企数据中台上线 | EA周报...
  4. 中学关于计算机方面的课题研究,《多媒体信息技术与初中生物教学的整合》课题研究方案...
  5. Siebel应用数据结构层次
  6. 梦三显示服务器列表,梦三国开服表_梦三国开服时间表_梦三国最新开服_9K9K手游网...
  7. python中sys是什么意思_python里的sys是什么意思
  8. C语言复习——投票问题——动态数组(2021.11.20)
  9. 怎样夸学计算机的人,学学古人是怎样夸人有才的
  10. 调用QQ与陌生人聊天