2017-09-28 52 views
3

我們目前正在研究使用多個列族對我們的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調用中獲得所需的信息,但不能再多了。

任何人對我們的發現有解釋嗎?

benchmark results


(編輯:增加了一些更多細節)

單個行中的含量:

表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)) 

回答

0

如果您檢索每行X細胞,它不會作出重大的性能差異這些細胞是否在X單獨列戶或1列的家庭與X列限定符。

的性能差異進來,如果你實際上只需要一個行具有某種特定的目的細胞 - 你可以在避免選擇所有單元格的行,而不只是獲取一個列族(通過指定filter on the ReadRow call


一個更重要的因素是簡單地選擇精確描述數據的模式。如果你這樣做,任何以上類型的收益都會自然而然地發生。你也會避免觸及100列家族推薦限制。

例如:假設您正在編寫排行榜軟件,並且您想要存儲玩家每次遊戲所獲得的分數以及一些個人信息。你的模式可能是:

  • 行鍵:用戶名
  • 柱族USER_INFO
    • 列預選賽FULL_NAME
    • 列預選賽password_hash
  • 柱族game_scores
    • 列預選賽candy_royale
    • 列預選賽clash_of_tanks

具有存儲作爲game_scores列族中的一個單獨列每場比賽允許所有得分對於一次抓取用戶而不抓取user_info,允許保留數量列家族可管理,允許每個遊戲的時間系列獨立分數以及鏡像數據性質的其他好處。

+1

Hi @David,謝謝你的回覆。我已經更新了一些關於行內容和我們正在執行的查詢的更多細節。正如你所看到的,我們確實執行了一個FamilyFilter。在我們的基準測試中,我們通過在** cf1 **上應用FamilyFilter來獲取** col1 **,然後執行與** col1 **完全匹配的ColumnFilter。所以我們希望對於表2來說,查詢會更快,因爲FamilyFilter會返回更少的數據。這個假設是不正確的? – krelst