WHERE
リクエストを制限します。 C *の仕組みを説明したサイクルの最初の記事を読んでいないと、この記事は複雑で混乱しているように見えます。 これを進める前にそれを読んでください。
この記事の目的は、C *初心者向けのリファレンスとして機能することです。
CQLとSQLのいくつかの違い
Cassandraクエリ言語( CQL )の
SELECT
クエリには、通常のSQL
JOIN
、
GROUP BY
操作がありません。 また、
WHERE
操作は大幅に切り捨てられます。 SQLでは、任意の列でフィルタリングできますが、CQLでは、 パーティションキー 、 クラスタリング 列、およびセカンダリインデックスでのみフィルタリングできます 。
注:C * 2.0では、SQLインデックスなどの任意の列に対してセカンダリINDEX
を作成できます。 実際、セカンダリKassandraインデックスは、ユーザーから隠された追加のテーブルです。したがって、それらに対するWHERE
クエリのパフォーマンスは、キー列に対するクエリよりも劣ります。
免責事項
- CQLはリリースごとに変更されます。 この記事には、 バージョン3のステータスが表示されます。 最新バージョンが3.1.2のときに作成されました。
- すべての例は、 前の 2番目の記事で作成した
ad_click
テーブルで作成されています。 また、この記事で使用される用語についても説明します。 少なくとも一見をお勧めします。
CREATE TABLE ad_click ( reseller_id text, day text, -- day in the format of 'YYYY-MM-DD' time timestamp, ad_id text, amount float, PRIMARY KEY ((reseller_id, day), time, ad_id) -- (reseller_id,day) (time,ad_id) ) WITH CLUSTERING ORDER BY (time DESC);
WHEREを使用したデータのフィルタリング
大まかに言って、「ろ過」という言葉はここでは不適切です。 検索と言う方が正確です。 C *はほとんどフィルタリングを許可しません。
各
WHERE
リクエストは、文字列が保存されているノードを見つけてそこにリクエストを渡すようにCassandraに指示します。
列を互いに比較する
JOIN
がないため、列を互いに比較することはできません。
SELECT * from ad_click WHERE maxTimeuuid(day) = maxTimeuuid(3141592653589); -- ;
および、または
WHERE
クエリの複数の条件は
OR
演算子と組み合わせることはできず、
AND
のみが機能します。 また、動作する比較演算子はごくわずかであり、常にそうとは限りません。
平等=
等号演算子(=)の使用はほぼ無制限です。 キー列とインデックス列に制限されています。 また、次のキー列を比較する前に、前のすべてのキー列を比較する必要があります。
正しく:
SELECT * FROM ad_click WHERE reseller_id = 'supaboobs' AND -- OK day = '2013-11-29' AND -- OK time = 3141592653589 AND -- OK ad_id = '890_567_234'; -- OK
間違った:
SELECT * FROM ad_click WHERE reseller_id = 'supaboobs' AND day = '2013-11-29' AND amount = 0; -- ! . SELECT * FROM ad_click WHERE day = '2013-11-29' AND -- ! reseller_id. time = 3141592653589 AND ad_id = '890_567_234'; SELECT * FROM ad_click WHERE reseller_id = 'supaboobs' AND day = '2013-11-29' AND ad_id = '890_567_234'; -- ! time.
インクルージョンIN
包含演算子(IN)の使用は、分散キーの最後の列とクラスターキーの最後の列に制限されています。
正しく:
SELECT * FROM ad_click WHERE reseller_id = 'supaboobs' AND day IN ('2013-11-28', '2013-11-29') AND -- OK time = 3141592653589 AND ad_id IN ('890_567_234', '890_567_010'); -- OK
間違った:
SELECT * FROM ad_click WHERE reseller_id IN ('supaboobs') AND -- ! . day = '2013-11-28' AND time = 3141592653589 AND ad_id = '890_567_234'; SELECT * FROM ad_click WHERE reseller_id = 'supaboobs' AND day = '2013-11-28' AND time IN (3141592653589) AND -- ! . ad_id = ('890_567_234');
比較演算子= >> = << =
比較構文
列名は比較演算子の左側に、値は右側になければなりません。
正しく:
SELECT * FROM ad_click WHERE reseller_id = 'supaboobs' AND -- OK day = '2013-11-29'; -- OK
間違った:
SELECT * FROM ad_click WHERE 'supaboobs' = reseller_id AND -- ! . '2013-11-29' = day AND -- ! . 3141592653589 < time; -- ! .
比較機能
CQLクエリの最後の列で使用でき、列は排他的にクラスタ化する必要があります。
正しく:
SELECT * FROM ad_click WHERE reseller_id = 'supaboobs' AND day = '2013-11-29' AND time >= 3141592653589; -- OK SELECT * FROM ad_click WHERE reseller_id = 'supaboobs' AND day = '2013-11-29' AND time = 3141592653589 AND ad_id > '890_567_234'; -- OK
間違った:
SELECT * FROM ad_click WHERE reseller_id = 'supaboobs' AND day = '2013-11-29' AND time >= 3141592653589 AND -- ! . ad_id = '890_567_234'; SELECT * FROM ad_click WHERE reseller_id = 'supaboobs' AND day = '2013-11-29' AND time >= 3141592653589 AND ad_id < '890_567_234'; -- ! . SELECT * FROM ad_click WHERE reseller_id = 'supaboobs' AND day = '2013-11-29' AND ad_id < '890_567_234'; -- ! time. SELECT * FROM ad_click WHERE reseller_id = 'supaboobs' AND day < '2013-11-29'; -- ! .
回避策-フィルタリングを許可する
配布キーを指定することはできませんが、クラスターのキーのみを残して、リクエストの最後に
ALLOW FILTERING
します。 他のすべての制限が適用されます。
重要! この場合のタイムアウトは、すべてのノードをすべての線に沿って通過するため、非常に可能性が高くなります。
正しく:
SELECT * FROM ad_click WHERE time = 3141592653589 AND -- OK ad_id > '890_567_234' -- OK ALLOW FILTERING; SELECT * FROM ad_click WHERE time >= 3141592653589 AND -- OK time <= 3141592653589 -- OK ALLOW FILTERING;
間違った:
SELECT * FROM ad_click WHERE time >= 3141592653589 AND ad_id > '890_567_234' -- ! . ALLOW FILTERING; SELECT * FROM ad_click WHERE time >= 3141592653589 AND time <= 3241592653589 AND ad_id = '890_567_234' -- ! . ALLOW FILTERING;
二次インデックス
セカンダリインデックスは等価演算子のみをサポートします。それだけです。 セカンダリインデックスの要求は、他のキーの有無にかかわらず実行できます。
セカンダリインデックスを作成するには、次のコマンドを実行する必要があります。
CREATE INDEX on ad_click (amount);
正しく:
SELECT * FROM ad_click WHERE amount = 0.0075; -- OK SELECT * FROM ad_click WHERE reseller_id = 'supaboobs' AND day = '2013-11-29' AND time = 3141592653589 AND ad_id = '890_567_234' AND amount = 0.0075; -- OK
間違った:
SELECT * FROM ad_click WHERE reseller_id = 'supaboobs' AND day = '2013-11-29' AND time = 3141592653589 AND ad_id = '890_567_234' AND amount > 0.0; -- ! .
おわりに
「なぜSELECTが機能しないのか」という質問がなくなることを願っています。
ソース
サイクルの前の記事 。