DS201学習記録:Cassandraのクラスタリングカラムについて

DS201: Foundations of Apache Cassandra™ and DataStax Enterprise の学習記録です。

クラスタリングカラム (Clustering Column)

Cassandraのテーブルにおけるクラスタリングカラムとは、PRIMARY KEY の一部であり、パーティションキーではないカラムを指します。クラスタリングカラムは、同じパーティションキーを持つデータがディスク上でどのようにソートされ、格納されるかを決定します。

プライマリキーの構成

Cassandraの PRIMARY KEY は、以下の2つの部分から構成されます。

  1. パーティションキー (Partition Key): プライマリキーの最初のカラム(または括弧で囲まれた複数のカラム)がパーティションキーとなります。データがクラスター内のどのノードに格納されるかを決定します。
  2. クラスタリングカラム (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)

この結果から、tagdatastax の行と cassandra の行がそれぞれグループ化され、各グループ内で added_date が新しい順に並んでいることが確認できます。

クラスタリングカラムの重要性

  • 効率的な範囲クエリ: クラスタリングカラムによってデータがソートされるため、同じパーティションキー内での範囲クエリ(例: 特定のタグの最新10件の動画を取得)が非常に効率的に行えます。
  • データモデルの柔軟性: 異なるアクセスパターンに対応するために、同じデータに対して複数のテーブル(マテリアライズドビューのような概念)を作成する「デノーマライゼーション」を行う際に、クラスタリングカラムが重要な役割を果たします。

適切なパーティションキーとクラスタリングカラムの設計は、Cassandraのデータモデル設計において最も重要な要素の一つです。