【Cassandra Day之路】Cassandra的材料化视图
首先
东京的卡桑德拉日
今年,2023年6月1日,Cassandra Day将在日本举办。去年,Cassandra Day在柏林、伦敦、阿姆斯特丹、河内、雅加达、休斯顿、圣克拉拉、西雅图和新加坡等地也举办过。
为了本次在东京的举办,我们将发布有关Apache Cassandra的文章。
关于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';
请给予参考资料
您可以参考以下文件等以了解具体的物料化视图的机制。