2013-07-24 107 views
0

我一直在與卡桑德拉和我已經打了一下一個絆腳石。對於我是多麼需要在數據搜索,我發現一個複合主鍵我需要什麼,而是在此列家庭記錄插入的時間去與它的狗的偉大工程,我不完全知道爲什麼。緩慢插入時間與複合主鍵在卡桑德拉

表定義:

CREATE TABLE exampletable (
clientid int, 
filledday int, 
filledtime bigint, 
id uuid, 
...etc... 
PRIMARY KEY (clientid, filledday, filledtime, id) 
); 

的clientid =客戶端的內部ID。 filledday =自1/1/1900以來的天數。 filledtime =記錄被收回當天的滴答數。 id =一個Guid。

的日期和時間結構的存在是因爲我需要能夠白天方便,快捷地進行篩選。

我知道有複合主鍵完全不同卡桑德拉商店列族。從我的理解它會保存一切,離主鍵的主要成分的基行的新列。這是插入緩慢的原因嗎?當我說慢我的意思是,如果我只是在ID上的主鍵插入將需要約200毫秒,並與複合主鍵(或任何其子集,我只是clientid和ID試圖相同的效果),它會採取1000條記錄超過32秒。選擇時間快於複合鍵表,因爲我必須應用二級索引並使用'ALLOW FILTERING'以便用標準鍵表獲得正確的記錄(我知道我可以在代碼中執行此操作,但問題是我正在處理一些海量的數據集,並不總是實際或可能的)。

難道我宣佈柱族或主鍵錯了什麼,我想幹什麼?對於所有未列出的非主鍵列,該表的列寬爲37列,這是否會成爲問題?我很困惑這一點。我無法真正找到其他有類似問題的人。

回答

0

那麼,你的分區鍵是客戶端ID,所以每個客戶端都寫入到一個節點。如果你正在編寫大量的每個客戶端的數據,你可能最終與熱點,從而降低您的總吞吐量。

此外,您還可以給您運行查詢的例子嗎?在Cassandra中,數據模型總是需要類似於您想要運行的查詢。如果你需要「允許過濾」,那麼你的數據模型看起來不太正確。例如,我沒有在你的PK中看到「充實時間」這一點。如果要按時間段查詢,只需用TimeUUID列「ts」替換三個列鍵。這將創建一個寬行,每一個條目的列有獨特timestam,集羣/每客戶端ID分區。 這使得查詢:

select * from exampletable where clientid = 123 and ts > minTimeuuid('2013-06-18 16:23:00') and ts < minTimeuuid('2013-06-18 16:24:00'); 

同樣,這將取決於你的實際需要來運行查詢。

最後,對數據建模總體指導,看看到this ebay tech blog。讀它幫助我爲我清理了一些東西。

希望有幫助!

+0

對於查詢的一個例子,我需要能夠做的事情一樣得到以下幾點:1)獲取一個客戶記錄每天 2)獲取記錄的日期和時間的客戶端。 我正在使用填滿和填充時間主要是因爲我的代碼庫是.Net,並沒有建立在timeuuids的功能。我現在有一些東西,所以我給他們一個嘗試。我現在看到這個問題的方式是我需要找到一個關鍵結構,它可以讓我在不瞭解客戶和時間的情況下完成這些查詢,但仍然可以將數據分開以便不會使插入變慢。注意:數據集非常大。 – Bozarth

+0

我建議使用我上面提出的結構,並使用[.NET客戶端,如fluentcassandra](https://github.com/fluentcassandra/fluentcassandra)來使用TimeUUID。 爲了避免熱點可以很容易地只添加一個隨機整數(從預定義的範圍等0-9),並形成像這樣的複合分區鍵: 'CREATE TABLE exampletable( 的clientid INT, 桶,整數 ID timeuuid , ... PRIMARY KEY((客戶端ID,桶),ID) );' 'SELECT * FROM exampletable其中的clientid = 123和剷鬥IN(0,1,2,3,4,5,6 ,7,8,9)和ts> minTimeuuid('2013-06-18 00:00:01')和ts omnibear