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更适合哪个行(请参阅)。不幸的是,如果它不适合内存,除了添加更多内存之外,没有什么好方法可以解决这个问题