Singlestore 基于MemSQL的列存储稀疏矩阵

Singlestore 基于MemSQL的列存储稀疏矩阵,singlestore,Singlestore,我是column store db系列的新手,有些概念我还不完全清楚。我想用MemSQL来存储稀疏矩阵 该表的外观如下所示: CREATE TABLE matrix ( r_id INT, c_id INT, cell_data VARCHAR(10), KEY (`r_id`, `c_id`) USING CLUSTERED COLUMNSTORE, ); 查询: 从矩阵中选择c_id、cell_数据,其中r_id=即整行 从矩阵中选择r_id、cell_数据,其中c_id=即整列 从矩阵中

我是column store db系列的新手,有些概念我还不完全清楚。我想用MemSQL来存储稀疏矩阵

该表的外观如下所示:

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

  • 从矩阵中选择c_id、cell_数据,其中r_id=即整行
  • 从矩阵中选择r_id、cell_数据,其中c_id=即整列
  • 从矩阵中选择单元格数据,其中r_id=和c_id=即一个单元格
  • 更新矩阵集cell_data=其中r_id=和c_id=
  • 插入矩阵值(,)
  • 查询1和查询2的频率大致相同,查询3、查询4和查询5的频率也相同。Q1,2中的一个与Q3,4,5中的一个频率相同(即Q1,2:Q3,4,5~=1:1)

    我确实意识到,在列存储中一次插入一行会为每次插入创建行段组,从而降低性能。我不能批量插入。此外,我不能使用内存行存储(矩阵太大)

    我有三个问题:

  • 如果仅更改了
    单元格_数据
    (即Q4),单行插入的问题是否也与更新有关

  • 是否有可能在内存中有一个行表,我可以在其中执行插入(?和更新?)操作,并定期将内容批处理到列表中

    • 如果我需要最新的数据(?UNION ALL?),我将如何执行Q1,2
    • 是否可以避免对两个表执行Q3(?这意味着两次往返?)
  • 我担心Q1和Q2的执行速度。集群密钥是否最适合这些应用程序。我不确定这些记录将如何与上面的表一起存储

  • 一,。 是的,单行更新的性能也很差——它们本质上是删除和插入

    二,。 是的,事实上,我们会在幕后自动执行此操作-最近插入的数据(如果它的行数太少,无法成为一个好的列段)保存在内存行存储形式中,读取查询基本上是查看所有这些数据和面向列的数据的联合。然后,我们将这些数据批处理成面向列的形式

    如果这还不够好,根据您的工作负载,您可能会受益于将部分数据显式保留在rowstore表中,而不是依赖于上述行为,在这种情况下:

    2a。是的,要查看最新数据,您将使用UNION ALL

    2b。数据可以在任何一个表中,因此您必须同时查询这两个表(如Q1,2,使用UNIONALL works)。这不需要两次往返,只需要一次

    三,。 您可以在当前模式的columnstore key-r中按r或c排序。这使得对行的查询效率很高,但对列的查询效率很低,它们可能必须扫描整个表(取决于数据中的模式)。不幸的是,columnstore表不支持使用多个键,因此没有解决这个问题的好方法。一个潜在的黑客解决方案是维护表的两个副本,一个带有键(r,c),另一个带有键(c,r)——这基本上是手动维护两个索引

    根据您描述的工作负载,听起来您正在进行许多单行查询(Q3、4、5,占工作负载的50%),其中rowstore比columnstore更适合哪个行(请参阅)。不幸的是,如果它不适合内存,除了添加更多内存之外,没有什么好方法可以解决这个问题