2015-12-08 33 views
1

我是新的列存儲數據庫家族,一些概念尚未完全清楚。我想用MemSQL來存儲稀疏矩陣。在MemSQL上使用列存儲的稀疏矩陣

表會是這個樣子:

CREATE TABLE matrix (
r_id INT, 
c_id INT, 
cell_data VARCHAR(10), 
KEY (`r_id`, `c_id`) USING CLUSTERED COLUMNSTORE, 
); 

的查詢:

  1. SELECT c_id, cell_data FROM matrix WHERE r_id=<val>;即整排
  2. SELECT r_id, cell_data FROM matrix WHERE c_id=<val>;即整列
  3. SELECT cell_data FROM matrix WHERE r_id=<val1> AND c_id=<val2>;即一個細胞
  4. UPDATE matrix SET cell_data=<val> WHERE r_id=<val1> AND c_id=<val2>;
  5. INSERT INTO matrix VALUES (<v1>, <v2>, <v3>);

的查詢1和2是大約相等地頻繁和3,4和5也同樣頻繁。 Q1,2之一與Q3,4,5之一(即Q1,2:Q3,4,5〜= 1:1)同樣頻繁。

我的確意識到,一次向列存儲一行插入會爲每個插入創建一個行段組,從而降低性能。我無法批量插入。此外,我不能使用內存中的行存儲(矩陣太大)。

我有三個問題:

  1. 是否與單排的問題插入關注更新太多,如果只cell_data改變(即Q4)?

  2. 是否有可能擁有內存中的行表,我將執行INSERT(?和UPDATE?)操作並定期將內容批量添加到列表中?

    • 如果我需要最新數據(?UNION ALL?),我將如何執行Q1.2?
    • 是否有可能避免對兩個表執行Q3(?這意味着兩次往返?)?
  3. 我擔心Q1和Q2的執行速度。羣集鍵最適合這些人。我不知道如何將記錄存儲在上面的表格中。

回答

1

1. 是的,單行更新也表現不佳 - 它們基本上是刪除和插入。

2. 是的,事實上,我們在後臺自動執行此操作 - 最近插入的數據(如果數量太小,將成爲良好的列式段)保存在內存中的行存儲表單和讀取查詢基本上都在查看UNION ALL數據和列式數據。然後,我們將這些數據批量寫入列式表單。

如果不工作不夠好,這取決於你的工作量,你可以明確地保持你的一些數據在rowstore表,而不是依靠上述行爲,有利於在這種情況下:

2A。是的,要查看您將使用的最新數據聯盟全部

2b。數據可能在任何一個表中,所以你必須查詢兩者(例如Q1.2,使用UNION ALL作品)。這不會做兩次往返,只有一次。

3. 您可以按r或c先在當前模式中的列存儲鍵r中進行排序。這樣可以有效地查詢行,但查詢列的效率會非常低,可能需要基本掃描整個表(具體取決於數據中的模式)。不幸的是,列存儲表不支持使用多個密鑰,因此沒有很好的方法來解決這個問題。一個可能的解決方法是維護表的兩個副本,一個使用密鑰(r,c),另一個使用密鑰(c,r) - 這實質上是手動維護兩個索引。

根據你描述的工作量,聽起來你正在做很多單行查詢(Q3,4,5,這是工作量的50%),哪個rowstore比列存儲更適合見http://docs.memsql.com/latest/concepts/columnstore/)。不幸的是,如果它不適合內存,那麼除了增加更多內存之外,解決這個問題並不是一個好方法。