摘要

本文主要介绍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

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

Cassandra Secondary Index 介绍的更多相关文章

  1. 23.Secondary Index

    一. Secondary Index(二级索引)1.1. Secondary Index 介绍 • Clustered Index(聚集索引) ◦ 叶子节点存储所有记录(all row data) • ...

  2. [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 ...

  3. cassandra 并发技术介绍

    摘要 本文主要介绍cassandra线程技术,cassandra的实现是基于java的,所以线程技术使用的也是jdk包提供的线程类.cassandra是分布式数据库,整个并发架构是基于阶段事件驱动架构 ...

  4. PLSQL_性能优化索引Index介绍(概念)

    2014-06-01 BaoXinjian

  5. Oracle索引(Index)介绍使用

    1.什么是引 索引是建立在表的一列或多个列上的辅助对象,目的是加快访问表中的数据:Oracle存储索引的数据结构是B*树,位图索引也是如此,只不过是叶子节点不同B*数索引:索引由根节点.分支节点和叶子 ...

  6. 聚簇索引(clustered index )和非聚簇索引(secondary index)的区别

    这两个名字虽然都叫做索引,但这并不是一种单独的索引类型,而是一种数据存储方式.对于聚簇索引存储来说,行数据和主键B+树存储在一起,辅助键B+树只存储辅助键和主键,主键和非主键B+树几乎是两种类型的树. ...

  7. Mongo Index

    摘要 mongo 的索引非常强大,和关系型数据库索引没什么区别.这里主要介绍本人在mongo索引上的犯的错. 索引种类 1.单字段索引 2.复合索引 多个字段索引 如{name:1,address:1 ...

  8. cassandra 3.x官方文档(7)---内部原理之如何读写数据

    写在前面 cassandra3.x官方文档的非官方翻译.翻译内容水平全依赖本人英文水平和对cassandra的理解.所以强烈建议阅读英文版cassandra 3.x 官方文档.此文档一半是翻译,一半是 ...

  9. Hadoop介绍-4.Hadoop中NameNode、DataNode、Secondary、NameNode、JobTracker TaskTracker

    Hadoop是一个能够对大量数据进行分布式处理的软体框架,实现了Google的MapReduce编程模型和框架,能够把应用程式分割成许多的 小的工作单元,并把这些单元放到任何集群节点上执行.在MapR ...

随机推荐

  1. MySQL集合操作类型

    SQL语言包含3个集合操作符(union.intersect.expect)以执行各种集合操作. 此外,每个集合操作符可以有两种修饰符:一个表是包含重复项,另一个表是去除重复项(但不一定时所有的重复项 ...

  2. 确定稳定的 Spring Cloud 相关环境版本

    开发部署 Spring Cloud 微服务框架,需要先确定 Spring Cloud 的相关环境版本,主要包含:Spring Cloud.Spring Cloud Netflix.JDK.JRE.Ja ...

  3. HTC Vive 叠影器无法创建设备

    今天使用笔记本电脑打开SteamVR发生错误:SteamVR启动失败,"Shared IPC Compositor Connected Fail(306)",然后启动失败,在UI界 ...

  4. Java中对象比较的方法

    class Person{ private String name; private int age; public Person(String name,int age){ this.name = ...

  5. 个人建站&mac下安装hexo

    title: 个人建站&mac下安装hexo date: 2018-04-18 16:34:02 tags: [mac,blog,个人建站,markdown] --- 这两天使用了markdo ...

  6. [BZOJ 4361]isn

    Description 题库链接 给出一个长度为 \(n\) 的序列 \(A\) .如果序列 \(A\) 不是非降的,你必须从中删去一个数,这一操作,直到 \(A\) 非降为止.求有多少种不同的操作方 ...

  7. [HNOI 2004]树的计数

    Description 一个有n个结点的树,设它的结点分别为v1, v2, …, vn,已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵.给定n,d1, d2, …, dn,编程需要 ...

  8. [JSOI2007]字符加密

    题目描述 喜欢钻研问题的JS 同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密办法:把需要加密的信息排成一圈,显然,它们有很多种不同的读法. 例如‘JSOI07’,可以读作 ...

  9. AtCoder Grand Contest 021 D - Reversed LCS

    Description Takahashi has decided to give a string to his mother. The value of a string T is the len ...

  10. 【LSGDOJ1834 Tree】树链剖分

    题目描述 给定一个N个结点的无向树,树中的结点按照1...N编号,树中的边按照1...N − 1编号,每条边都赋予一个权值.你需要编写程序支持以下三种操作: 1.    CHANGE i v:将i号边 ...