cassandra实战--物化视图(Materialized View)

在关系型数据库中,例如Mysql,视图是一个非常有用的功能。当项目遇到复杂业务的时候,不可避免的需要创建中间表来完成需求。通过视图,我们可以定制用户的数据,针对公司不同角色创建不同的视图,提供其需要的数据;其次,视图可以简化数据操作,对于频繁发生的操作,我们可以创建相应的视图。对于关系型数据库,视图是一张虚拟表,只提供对真实数据的引用,如果真实表发生变化,视图也相应发生变化。NoSql一般不支持视图功能,对于cassandra而言,需要在一开始就明确自己的表结构,如果需要反范式操作,可以通过建立second index或者建立多张表来实现,second index 适合小规模数据,如果数据量很大,Cassandra将访问集群中的每一个节点,这对读写性能有影响。

         从cassandra3.0版本开始支持物化视图功能,在MySQL中,视图是一个虚拟表,而在cassandra中,view是真实的存储着数据的,因此称为Materialized(物化),当源基础表数据发生删除,视图表中的数据也会被删除。下面笔者将简单介绍一下如何建立和使用视图,所采用的版本为cassandra3.0.8。笔者首先创建一张表结构,如下:

CREATE TABLE t (
    k int,
    c1 int,
    c2 int,
    v1 int,
    v2 int,
    PRIMARY KEY (k, c1, c2)
)

我们可以向表中随机写入一些数据,数据如下:

 k  | c1 | c2 | v1 | v2
----+----+----+----+----
 55 | 55 | 44 | 44 | 44
 33 | 33 | 33 | 33 | 33
 11 | 11 | 11 | 11 | 11
 44 | 44 | 44 | 44 | 44
 22 | 22 | 22 | 22 | 22

然后我们开始建立视图,这里需要注意

1.非primarykey 的列,例如表中的v1 v2 只能被IS NOT NULL限定;

2.视图表primarykey中的列不能为空,至少要被ISNOT NULL限定住,或者其他限制条件;

3.需要把源真实表中的primarykey 都列在视图表的primarykey 中,否则会出现下列问题

InvalidRequest: Error from server: code=2200 [Invalid query]message="Cannot create Materialized View mv2 without primary key columnsfrom base t (c2)"

4.源真实表中的非primary key列,最多只能放一个作为视图表中的primary key,否则会出现下列问题

InvalidRequest: Error from server: code=2200 [Invalid query]message="Cannot include more than one non-primary key column 'v2' inmaterialized view partition key"

CREATE MATERIALIZED VIEW mv1 AS
    SELECT * FROM t WHERE k IS NOT NULL AND c1 IS NOT NULL AND c2 IS NOT NULL
PRIMARY KEY (c1, k, c2);
使用SELECT * FROM mv1 我们可以查看视图表mv1中的数据,可以发现视图表mv1中数据已经更新,且表结构为我们重新设计的表结构。
 c1 | k  | c2 | v1 | v2
----+----+----+----+----
 55 | 55 | 44 | 44 | 44
 33 | 33 | 33 | 33 | 33
 11 | 11 | 11 | 11 | 11
 44 | 44 | 44 | 44 | 44
 22 | 22 | 22 | 22 | 22

CREATE MATERIALIZED VIEW mv2 AS
    SELECT v2 FROM t WHERE k IS NOT NULL AND c1 IS NOT NULL AND c2 IS NOT NULL AND v1 IS NOT NULL PRIMARY KEY (v1, k, c1, c2);
 v1 | k  | c1 | c2 | v2
----+----+----+----+----
 33 | 33 | 33 | 33 | 33
 11 | 11 | 11 | 11 | 11
 44 | 44 | 44 | 44 | 44
 44 | 55 | 55 | 44 | 44
 22 | 22 | 22 | 22 | 22

可以增加with条件,比如按v2的升序排列,默认显示前两行
CREATE MATERIALIZED VIEW mv3 AS
    SELECT v1 FROM t WHERE k IS NOT NULL AND c1 IS NOT NULL AND c2 IS NOT NULL AND v2 IS NOT NULL
PRIMARY KEY ((c1,c2, k),v2) WITH CLUSTERING ORDER BY (v2 desc)
c1 | c2 | k  | v2 | v1
----+----+----+----+----
 11 | 11 | 11 | 11 | 11

 33 | 33 | 33 | 33 | 33

物化视图的优缺点:

1.视图和源数据表具有相同的读性能。

2.视图没有正常列表的写性能,每次更新视图,Cassandra都要做一个read-before-write,同时cassandra需要检查每一个副本的一致性,这也对写入操作造成了额外的延迟;

3.Cassandra只对源表进行写操作,但是会异步的对视图进行更新,所以会有一点延迟;

4.数据量比较小的情况下会造成热点,特别是如果分区键都一样或者很少,会对集群中某一节点造成高负荷;

你可能感兴趣的:(cassandra)