2017-06-04 40 views
1

這是我用來創建表的代碼:卡桑德拉CQL替代或WHERE子句

CREATE TABLE test.packages (
    packageuuid timeuuid, 
    ruserid text, 
    suserid text, 
    timestamp int, 
    PRIMARY KEY (ruserid, suserid, packageuuid, timestamp) 
); 

,然後創建一個物化視圖:

CREATE MATERIALIZED VIEW test.packages_by_userid 
    AS SELECT * FROM test.packages 
    WHERE ruserid IS NOT NULL 
     AND suserid IS NOT NULL 
     AND TIMESTAMP IS NOT NULL 
     AND packageuuid IS NOT NULL 
    PRIMARY KEY (ruserid, suserid, timestamp, packageuuid) 
    WITH CLUSTERING ORDER BY (packageuuid DESC); 

我希望能夠搜索對於兩個ID

之間發送的數據包

,所以我需要這樣的:

SELECT * FROM test.packages_by_userid WHERE (ruserid = '1' AND suserid = '2' AND suserid = '1' AND ruserid = '2') AND timestamp > 1496601553; 

我該如何用CQL完成這樣的事情?

我已經搜索了一下,但我無法弄清楚。

我願意改變表的結構,如果它會使這樣的事情成爲可能。

如果沒有物化視圖也是可行的,那也不錯。

回答

1

使用IN子句:

SELECT * FROM test.packages_by_userid WHERE ruserid IN ('1', '2') AND suserid IN ('1','2') AND timestamp > 1496601553; 

注:保持在第尺寸較小,大在分區可能會導致GC暫停現象,導致性能整體較慢堆壓條款

實際上,這意味着你在等待這個單一的協調器節點給你一個響應,它將所有這些查詢和它們的響應保存在堆中,並且如果其中一個查詢fa ils,或協調員失敗,你必須重試整個事情。

如果多分區在子句中較大嘗試使用單獨查詢,對於每個分區(ruserid)和executeAsync

SELECT * FROM test.packages_by_userid WHERE ruserid = '1' AND suserid IN ('1','2') AND timestamp > 1496601553; 
SELECT * FROM test.packages_by_userid WHERE ruserid = '2' AND suserid IN ('1','2') AND timestamp > 1496601553; 

瞭解更多:https://lostechies.com/ryansvihla/2014/09/22/cassandra-query-patterns-not-using-the-in-query-for-multiple-partitions/

+0

再次感謝! in子句總是包含兩個用戶ID,所以希望我沒有減速問題。 –

+0

這很好,那麼你可以毫無疑問地使用子句解決方案。 –

+0

我從來沒有見過CQL語法* ruserid IN('1','2')和suserid IN('1','2')*帶有雙* IN *子句。其中Cassandra版本的語法是否有效?你的意思是*(ruserid,suserid)IN(('1','2'),('1','2'))*? – xmas79

0

既然你隨時搜索發送者和接收者,我會用下面的表格佈局模型這樣的:

CREATE TABLE test.packages (
    ruserid text, 
    suserid text, 
    timestamp int, 
    packageuuid timeuuid, 
    PRIMARY KEY ((ruserid, suserid), timestamp) 
); 

這樣,每對您需要運行兩個查詢,每個分區一個:

SELECT * FROM packages WHERE ruserid=1 AND suserid=2 AND timestamp > 1496601553; 
SELECT * FROM packages WHERE ruserid=2 AND suserid=1 AND timestamp > 1496601553; 

這是恕我直言的最佳解決方案,因爲請記住,在卡桑德拉你從你的查詢開始,並建立你的表模型,從來沒有相反。