【Cassandra Day之路】Cassandra的材料化视图

首先

东京的卡桑德拉日

今年,2023年6月1日,Cassandra Day将在日本举办。去年,Cassandra Day在柏林、伦敦、阿姆斯特丹、河内、雅加达、休斯顿、圣克拉拉、西雅图和新加坡等地也举办过。

为了本次在东京的举办,我们将发布有关Apache Cassandra的文章。

image.png

关于Apache Cassandra,

Apache Cassandra是一个开源的分布式数据库管理系统。

与其他分布式数据库管理系统类似,我们可以使用多个通用服务器来构建一个数据库(也可以只用一个服务器来满足开发等目的)。

在这里,我们将省略详细的说明,将介绍给对此感兴趣的人,这个角色将交给官方网站和维基百科。

 

Cassandra的物化视图

我們將解釋Cassandra的物化視圖。

在Cassandra(广泛使用的数据库,如HBase)中,我们使用所谓的”查询驱动方法”来根据查询需求设计和定义表。如果存储的数据相同但存在不同的搜索需求,我们会定义另一个与该查询对应的表。

考虑到这种“不同的搜索需求”,可以利用Cassandra提供的物化视图功能。

卡桑德拉的材料化视图

在Cassandra中,您可以使用现有表(源表)的数据,并指定新的主键和新的属性来创建物化视图。物化视图的数据会随着源表的更改自动更新。当源表中的数据被删除时,相关物化视图中的相同数据也会被删除。

此外,客户端无法直接向物化视图写入数据。

数据插入到源表后,物化视图会以异步方式进行更新,因此物化视图的更新会与源表的更新存在延迟。

关于定义的限制事项在实体化视图中。

    • マテリアライズド・ビューのプライマリ・キーにソース・テーブルのプライマリ・キーをすべて含めます。

 

    • マテリアライズド・ビューのプライマリ・キーに追加できるカラムは1つのみです。スタティックカラムは使用できません。

 

    マテリアライズド・ビューのプライマリ・キーとして指定されたカラムにNull値を持つ行を除外します。

材料化视图可以使用独特的WHERE条件和属性进行创建。

(次要)索引和使用指南的选择

在使用现有表格的基础上,为了满足不同的搜索需求,还可以使用辅助索引。
关于这些使用方式,有以下的指导原则。

マテリアライズド・ビューは、カーディナリティが高いデータに適しています。マテリアライズド・ビューのデータは、ビューのプライマリ・キーに基づいて連続して配置されます。カーディナリティが低いデータを挿入すると、マテリアライズド・ビューではホットスポット(特定のデータ、つまりノードへのアクセス集中)が生じます。

セカンダリ・インデックスは、カーディナリティが低いデータに適しています。セカンダリ・インデックスに対してカーディナリティが高いカラムのクエリーを実行するには、データベースがクラスター内のすべてのノードにアクセスする必要があるため、読み取りレイテンシーが高くなります。

材料化视图的示例

首先,假设有以下现有的表格。

CREATE TABLE cyclist (cid UUID PRIMARY KEY, name text, age int, birthday date, country text);

您可以将此表作为源表,创建以下方式的物化视图。

CREATE MATERIALIZED VIEW cyclist_by_age 
AS SELECT age, birthday, name, country 
FROM cyclist 
WHERE age IS NOT NULL AND cid IS NOT NULL 
PRIMARY KEY (age, cid);

這個CREATE MATERIALIZED VIEW語句具有多個功能。
– AS SELECT子句指定了從基礎表複製到物化視圖的列。

FROM句は、データのコピー元であるソース・テーブルを指定します。

WHERE句は、すべてのプライマリ・キー・カラムのデータのある行のみがマテリアライズド・ビューにコピーされるように、IS NOT NULL句を使用してすべてのプライマリ・キー・カラムを含める必要があります。
他のテーブルと同様に、プライマリ・キー・カラムを指定します。cyclist(ソース・テーブル)ではプライマリ・キーとしてcidを使用しているため、マテリアライズド・ビューのプライマリ・キーにcidが含まれている必要があります。

注意:此物化视图使用age作为主键,cid是聚簇列。在DataStax Enterprise 5.0之前,聚簇列的最大大小为64 KB。

这个材料化视图可以针对骑行者的年龄进行查询。

SELECT age, name, birthday FROM cyclist_by_age WHERE age = 18;

我们可以基于同一源表格创建另一个物化视图,按照骑行者的出生日期和国籍对信息进行整理。

CREATE MATERIALIZED VIEW cyclist_by_birthday 
AS SELECT age, birthday, name, country 
FROM cyclist
WHERE birthday IS NOT NULL AND cid IS NOT NULL
PRIMARY KEY (birthday, cid);

CREATE MATERIALIZED VIEW cyclist_by_country 
AS SELECT age,birthday, name, country 
FROM cyclist 
WHERE country IS NOT NULL AND cid IS NOT NULL
PRIMARY KEY (country, cid);

在以下查询中使用新的物化视图。

SELECT age, name, birthday FROM cyclist_by_country WHERE country = 'Netherlands';

SELECT age, name, birthday FROM cyclist_by_birthday WHERE birthday = '1987-09-04';

您还可以使用包含对非主键列的限制的过滤处理创建物化视图。

CREATE MATERIALIZED VIEW cyclist_by_birthday_Netherlands 
AS SELECT age, birthday, name, country 
FROM cyclist 
WHERE birthday IS NOT NULL AND cid IS NOT NULL
AND country='Netherlands'
PRIMARY KEY (birthday, cid);

这个 Materialized View 通过在 WHERE 子句中添加 AND country=’Netherlands’ ,仅存储来自荷兰(Netherlands)的自行车选手信息。此外,还可以执行查询以搜索特定生日的荷兰自行车选手。

SELECT age, name, birthday FROM cyclist_by_birthday WHERE birthday = '1997-02-08';

请给予参考资料

您可以参考以下文件等以了解具体的物料化视图的机制。

 

广告
将在 10 秒后关闭
bannerAds