2016-03-01 119 views
1

我有這個表:卡桑德拉秩序和聚集鍵

CREATE TABLE custumer_events_service.events_by_websiteId_time(
    "event_id" text, 
    "currentTime" timestamp, 
    "websiteId" varchar, 

    OTHER COLUMNS ... 

    PRIMARY KEY(event_id, websiteId, currentTime) 
) 

在這種情況下,我會得到通過currentime有序當我執行此查詢10000行:

SELECT * FROM events_by_websiteid_time WHERE websiteid='xxxx' LIMIT 10000 ALLOW FILTERING; 

還是我要在末尾添加WITH CLUSTERING ORDER BY (currentTime DESC);

回答

3

Cassandra只能在分區內執行排序順序。由於您使用ALLOW FILTERING以避免必須提供分區密鑰(event_id),因此您的結果集將按每個event_id的散列標記值排序,然後由websiteidcurrentTime排序。

要讓您的結果按照currentTime排序,您需要創建一個新的查詢表或更改現有表的PRIMARY KEY定義(也可能是CLUSTERING ORDER)。如果你決定創建一個新的查詢表,它必須是這個樣子:

CREATE TABLE custumer_events_service.events_by_websiteId_time_eventid(
    event_id text, 
    currentTime timestamp, 
    websiteId varchar, 

OTHER COLUMNS ... 

    PRIMARY KEY (websiteid,currentTime,event_id)) 
WITH CLUSTERING ORDER BY (currentTime DESC, event_id ASC); 

這將使該查詢:

SELECT * FROM events_by_websiteid_time_eventid WHERE websiteid='xxxx' LIMIT 10000; 

...爲你所期望的工作。

+0

+1感謝您的回答Aron(再一次;-)),第一個解決方案(使用CLUSTERING ORDER)有什麼缺點?在第二種解決方案中,我不會冒我的羣集失衡的風險,因爲我通過websiteId有一個非等價的事件分佈。 – farhawa

+0

@farhawa第一個解決方案的缺點是涉及將數據複製到新的查詢表中。但是,如果您需要爲'websiteid'和'event_id'鍵入查詢,那麼您可能需要兩個表......交易磁盤以提高性能。至於第二種解決方案中的不平衡性,如果它有很大的差異,那麼添加額外的「存儲桶」來幫助分割數據(如日或月)或其他適合您的用例的其他內容是有意義的。 – Aaron

+0

當我學習cassandra時,我發佈了一個新問題http://stackoverflow.com/questions/35880249/cassandra-the-same-query-work-with-cql-but-not-with-python-driver can you看一看?提前致謝 – farhawa