cassandra实战--物化视图(Materialized View)
来源:互联网 发布:adhoc网络搭建 编辑:程序博客网 时间:2024/05/18 02:39
在关系型数据库中,例如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中数据已经更新,且表结构为我们重新设计的表结构。
----+----+----+----+----
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);
----+----+----+----+----
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)
----+----+----+----+----
11 | 11 | 11 | 11 | 11
33 | 33 | 33 | 33 | 33
物化视图的优缺点:
1.视图和源数据表具有相同的读性能。
2.视图没有正常列表的写性能,每次更新视图,Cassandra都要做一个read-before-write,同时cassandra需要检查每一个副本的一致性,这也对写入操作造成了额外的延迟;
3.Cassandra只对源表进行写操作,但是会异步的对视图进行更新,所以会有一点延迟;
4.数据量比较小的情况下会造成热点,特别是如果分区键都一样或者很少,会对集群中某一节点造成高负荷;
- cassandra实战--物化视图(Materialized View)
- 物化视图 Materialized View
- 物化视图(Materialized View)优化
- oracle物化视图(materialized view)
- ORACLE物化视图--实体化试图(Materialized View)介绍
- ORACLE物化视图--实体化试图(Materialized View)介绍
- 验证物化视图(materialized view)是否query rewrite
- 数据物化视图(materialized view)复制
- 【转帖】Materialized view terminology(物化视图)
- Oracle MATERIALIZED VIEW -- 创建物化视图
- Oracle+Materialized+View+(物化视图) (to H)
- Oracle MATERIALIZED VIEW -- 创建物化视图
- Oracle的物化视图 MATERIALIZED VIEW
- materialized view 物化视图-data warehousing
- TimesTen与Materialized View(物化视图)
- 基于主键创建物化视图(MATERIALIZED VIEW)
- 通过案例学调优之--跨库建立物化视图(Materialized View)
- ORACLE物化视图--snapshot和materialized view是什么关系?
- 1025
- musql密码的修改
- bzoj 1968: [Ahoi2005]COMMON 约数研究 (线性筛求约数个数)
- 【C++】《C++ Primer Plus》笔记(1)
- bzoj1034: [ZJOI2008]泡泡堂BNB
- cassandra实战--物化视图(Materialized View)
- App支持
- 使用 Vagrant 来管理 DigitalOcean 云主机
- Recursive Bubble Sort(递归冒泡排序)
- Hadoop 二次排序实现
- UML建模之时序图(Sequence Diagram)
- grpc(1):Centos 安装java的grpc服务,使用haproxy进行负载均衡,nginx不支持
- SQL高级语句-SELECT INTO 从一个表中选取数据,然后把数据插入另一个表中
- 软件的熵(entropy) 总结