DS201: Foundations of Apache Cassandra™ and DataStax Enterprise の学習記録です。
クラスタリングカラム (Clustering Column)
Cassandraのテーブルにおけるクラスタリングカラムとは、PRIMARY KEY
の一部であり、パーティションキーではないカラムを指します。クラスタリングカラムは、同じパーティションキーを持つデータがディスク上でどのようにソートされ、格納されるかを決定します。
プライマリキーの構成
Cassandraの PRIMARY KEY
は、以下の2つの部分から構成されます。
- パーティションキー (Partition Key): プライマリキーの最初のカラム(または括弧で囲まれた複数のカラム)がパーティションキーとなります。データがクラスター内のどのノードに格納されるかを決定します。
- クラスタリングカラム (Clustering Columns): パーティションキーに続くカラムがクラスタリングカラムとなります。同じパーティションキーを持つデータ(つまり、同じパーティション内のデータ)が、ディスク上でクラスタリングカラムの順序でソートされて格納されます。
クラスタリングカラムを指定したテーブル作成例
以下の例では、videos_by_tag
テーブルを作成しています。
CREATE TABLE videos_by_tag (
tag text,
video_id uuid,
added_date timestamp,
title text,
PRIMARY KEY ((tag), added_date, video_id)
) WITH CLUSTERING ORDER BY(added_date DESC);
このテーブル定義における PRIMARY KEY ((tag), added_date, video_id)
の意味は以下の通りです。
tag
: パーティションキーです。データはtag
の値に基づいてクラスター内のノードに分散されます。added_date
,video_id
: クラスタリングカラムです。同じtag
を持つデータは、added_date
の降順(DESC
)でソートされ、added_date
が同じ場合はvideo_id
でソートされて格納されます。
WITH CLUSTERING ORDER BY(added_date DESC)
は、added_date
カラムのソート順を明示的に降順に指定しています。これにより、最新の動画がパーティションの先頭に位置するようになります。
データ挿入後の確認
データを挿入し、SELECT * FROM videos_by_tag;
で確認すると、同じパーティションキー(tag
)を持つ行がまとめられ、added_date
の降順でソートされていることがわかります。
cqlsh:killrvideo> SELECT * FROM videos_by_tag;
tag | added_date | video_id | title
-----------+---------------------------------+--------------------------------------+------------------------------
datastax | 2013-10-16 09:00:00.000000+0000 | 4845ed97-14bd-11e5-8a40-8338255b7e33 | DataStax Studio
datastax | 2013-04-16 09:00:00.000000+0000 | 5645f8bd-14bd-11e5-af1a-8638355b8e3a | What is DataStax Enterprise?
cassandra | 2014-01-29 09:00:00.000000+0000 | 1645ea59-14bd-11e5-a993-8138354b7e31 | Cassandra History
cassandra | 2013-03-17 09:00:00.000000+0000 | 3452f7de-14bd-11e5-855e-8738355b7e3a | Cassandra Intro
cassandra | 2012-04-03 09:00:00.000000+0000 | 245e8024-14bd-11e5-9743-8238356b7e32 | Cassandra & SSDs
(5 rows)
この結果から、tag
が datastax
の行と cassandra
の行がそれぞれグループ化され、各グループ内で added_date
が新しい順に並んでいることが確認できます。
クラスタリングカラムの重要性
- 効率的な範囲クエリ: クラスタリングカラムによってデータがソートされるため、同じパーティションキー内での範囲クエリ(例: 特定のタグの最新10件の動画を取得)が非常に効率的に行えます。
- データモデルの柔軟性: 異なるアクセスパターンに対応するために、同じデータに対して複数のテーブル(マテリアライズドビューのような概念)を作成する「デノーマライゼーション」を行う際に、クラスタリングカラムが重要な役割を果たします。
適切なパーティションキーとクラスタリングカラムの設計は、Cassandraのデータモデル設計において最も重要な要素の一つです。