Cassandra テーブルでクラスター化インデックスを使用する必要があるのはなぜですか?
例えば; このような表で:
CREATE TABLE blah (
key text,
a text,
b timestamp,
c double,
PRIMARY KEY ((key), a, b, c)
)
クラスタ化された部分は のa, b, c
部分ですPRIMARY KEY
。
利点は何ですか?どのような考慮事項がありますか?
Cassandra テーブルでクラスター化インデックスを使用する必要があるのはなぜですか?
例えば; このような表で:
CREATE TABLE blah (
key text,
a text,
b timestamp,
c double,
PRIMARY KEY ((key), a, b, c)
)
クラスタ化された部分は のa, b, c
部分ですPRIMARY KEY
。
利点は何ですか?どのような考慮事項がありますか?
クラスタリング キーは、主に 3 つのことを行います。
1) それらは、テーブルの使用可能なクエリ パターンに影響します。
2) テーブルのディスク上のソート順を決定します。
3) 主キーの一意性を決定します。
注文システムを実行していて、Web サイトに製品データを保存したいとします。さらに、私はいくつかの配送センターと顧客契約価格を持っています。したがって、特定の顧客が私のサイトにいる場合、次の製品にのみアクセスできます。
地域の配送センター (DC) で入手できます。
契約で定義されています (そのため、DC 内のすべての製品にアクセスできるとは限りません)。
これらの製品を追跡するために、次のようなテーブルを作成します。
CREATE TABLE customerDCProducts (
customerid text,
dcid text,
productid text,
productname text,
productPrice int,
PRIMARY KEY (customerid, dcid, productid));
この例では、DC 1138 の顧客 B-26354 の製品 123 を見たい場合、次のクエリを使用できます。
SELECT * FROM customerDCProducts
WHERE customerid='B-26354' AND dcid='1138' AND productid='123';
たぶん、顧客 B-26354 の DC 1138 で入手可能な製品を見たいと思います。
SELECT * FROM customerDCProducts
WHERE customerid='B-26354' AND dcid='1138';
また、顧客 B-26354 のすべての DC のすべての製品を表示したいだけかもしれません。
SELECT * FROM customerDCProducts
WHERE customerid='B-26354';
ご覧のとおり、 と のクラスタリング キーによりdcid
、productid
パーティション キー ( ) に対して、必要に応じて焦点を絞った高性能のクエリを実行できcustomerid
ます。
欠点は?顧客に関係なく、単一の DC のすべての製品を照会したい場合、それはできません。それをサポートするには、別のクエリ テーブルを作成する必要があります。1 つの製品だけをクエリしたい場合でも、customerid
and も指定しないとできませんdcid
。
データを特定の方法で並べ替えたい場合はどうすればよいですか? この例では、時系列データ モデリングの開始に関する Patrick McFadin の記事からヒントを得て、気象観測所の最新の気温を追跡するテーブルを作成します。
CREATE TABLE latestTemperatures (
weatherstationid text,
eventtime timestamp,
temperature text,
PRIMARY KEY (weatherstationid,eventtime),
) WITH CLUSTERING ORDER BY (eventtime DESC);
でクラスタリングしeventtime
、末尾の ORDER BY を指定することで、DESC
次のように特定の観測所で記録された気温を照会できます。
SELECT * FROM latestTemperatures
WHERE weatherstationid='1234ABCD';
これらの値が返されるとき、それらはDESC
による終了順になりeventtime
ます。
もちろん、誰もが (RDBMS のバックグラウンドを持っている... そうです、誰もが) 知りたがっている 1 つの質問は、並べ替えられたすべての結果をクエリする方法eventtime
です。繰り返しますが、できません。もちろん、WHERE 句を省略してすべての行をクエリできますが、意味のある順序で並べ替えられたデータは返されません。Cassandra はパーティション キー内でのみクラスタリングの順序を適用できることに注意してください。指定しないと、データは順序付けされません (少なくとも、希望どおりにはなりません)。
他にご不明な点がございましたら、お気軽にお問い合わせください。喜んで説明させていただきます。