我們目前正在研究使用多個列族對我們的bigtable查詢性能的影響。我們發現將列拆分成多個列族不會提高性能。有沒有人有過類似的經歷?Bigtable性能影響列族
關於我們的基準設置的更多細節。此時,我們生產表中的每行包含大約5列,每列包含0.1到1 KB的數據。所有列都存儲在一個列族中。在執行行鍵範圍過濾器(平均返回340行)並應用列正則表達式過濾器(每行只返回1列)時,查詢平均需要23,3ms。我們創建了一些測試表,我們將每行的列/數據量增加了5倍。在測試表1中,我們將所有內容都保存在一個列中。正如預期的那樣,這將相同查詢的查詢時間增加到40.6ms。在測試表2中,我們將原始數據保存在一個列族中,但額外的數據被放入另一個列族中。當查詢包含原始數據的列族(因此包含與原始表相同數量的數據)時,查詢時間平均爲44.3ms。因此,使用更多色譜柱系列時,性能甚至會下降。
這與我們預期的完全相反。例如。這是在Bigtable的文檔(https://cloud.google.com/bigtable/docs/schema-design#column_families)
分組數據提到的成列的家庭可以讓你從一個家庭,或家庭的多重檢索數據,而不是檢索所有數據的每個一行。儘可能地將數據分組,以便在最頻繁的API調用中獲得所需的信息,但不能再多了。
任何人對我們的發現有解釋嗎?
(編輯:增加了一些更多細節)
單個行中的含量:
表1:
CF1
- COL1
- COL2
- ...
- col25
表2:
- CF1
-
個
- COL1
- COL2
- ..
- COL5
- CF2
- COL6
- COL7
- ...
- col25
我們使用轉客戶端執行的基準。調用API的代碼看起來基本如下:
filter = bigtable.ChainFilters(bigtable.FamilyFilter(request.ColumnFamily),
bigtable.ColumnFilter(colPattern), bigtable.LatestNFilter(1))
tbl := bf.Client.Open(table)
rr := bigtable.NewRange(request.RowKeyStart, request.RowKeyEnd)
err = tbl.ReadRows(c, rr, func(row bigtable.Row) bool {return true}, bigtable.RowFilter(filter))
Hi @David,謝謝你的回覆。我已經更新了一些關於行內容和我們正在執行的查詢的更多細節。正如你所看到的,我們確實執行了一個FamilyFilter。在我們的基準測試中,我們通過在** cf1 **上應用FamilyFilter來獲取** col1 **,然後執行與** col1 **完全匹配的ColumnFilter。所以我們希望對於表2來說,查詢會更快,因爲FamilyFilter會返回更少的數據。這個假設是不正確的? – krelst