2016-03-09 47 views
1

當前,我們有下表,它使我們能夠根據日期執行查詢。正在從頭開始創建一個新表,以支持新查詢在cassandra中的一個通用實踐

CREATE TABLE events_by_day(
    ... 
    traffic_type text, 
    device_class text, 
    country text, 
    ... 
    yyyymmdd text, 
    event_type text, 
    the_datetime timeuuid, 
    PRIMARY KEY((yyyymmdd, event_type), the_datetime)); 

create index index_country on events (country); 
create index index_traffic_type on events (traffic_type); 
create index index_device_class on events (device_class); 

正在支持以下查詢。

select * from events where yymmdd = '20160303' and event_type in ('view'); 
select * from events where yymmdd = '20160303' and event_type in ('lead', 'view', 'sales'); 
select * from events where yymmdd = '20160303' and event_type = 'lead' and country = 'my' and device_class = 'smart' and traffic_type = 'WEB' ALLOW FILTERING; 

當我們需要超過一天的數據時,我們將多次執行查詢。說,我需要「查看」2016年3月1日至2016年3月3日的數據,我會查詢3次。

select * from events where yymmdd = '20160301' and event_type in ('view'); 
select * from events where yymmdd = '20160302' and event_type in ('view'); 
select * from events where yymmdd = '20160303' and event_type in ('view'); 

目前,所有這些都符合我們的要求。

然而,在未來,讓我們說我們有一個新的要求,我們需要「視圖」的數據,從2013年至2016年

而不是查詢它1460倍(365天×4年),它是一個我們通常的做法是創建一個全新的空表像

CREATE TABLE events_by_year(
    ... 
    traffic_type text, 
    device_class text, 
    country text, 
    ... 
    yyyy text, 
    event_type text, 
    the_datetime timeuuid, 
    PRIMARY KEY((yyyy, event_type), the_datetime)); 

,然後用大量的數據從events_by_day填補數據(這可能需要幾天的時間才能完成插入爲events_by_day表已經有許多行)?

回答

1

我們創建一個全新的空表是否是一種常見的做法?

是的。這被稱爲「基於查詢的建模」,在Cassandra中很常見。雖然Cassandra可以擴展並且性能良好,但它並不能提供很大的查詢靈活性。所以爲了解決這個問題,不是使用不良的方法(二級索引,ALLOW FILTERING)來查詢現有的表,而是通常使用不同的PRIMARY KEY來複制該表。基本上,你正在交易磁盤空間的表現。

不是自我宣傳或任何事情,但我在最後的卡桑德拉峯會上就這個問題發表了一個演講。您可能會發現幻燈片很有用:Escaping Disco Era Data Modeling

說到性能,在分區鍵上使用IN關鍵字已被證明與使用輔助索引一樣糟糕。使用3個並行查詢,您將獲得更好的性能,與此相反:event_type in ('lead', 'view', 'sales')

此外,您的最後一個查詢使用的是ALLOW FILTERING,這是您在生產系統上永遠不應該做的事情,因爲它會導致您掃描整個表和幾個節點。

爲了獲得理想的性能,最好確保您的查詢針對特定的數據分區。這樣,您只會遇到單個節點,而不會在等式中引入無關的網絡流量。

+1

感謝您提及「爲性能交易磁盤空間」。 –

2

簡短的回答是肯定的。通常將每週,每月和每年的數據彙總到新表中,以便更有效地查詢。

例如,保持每日運行的滾動聚合(可能是另一個適合您的數據和要求的時間段)並計算這些值,而不是等到您需要它們然後運行一個需要幾天的過程。

相關問題