我是列存储数据库系列的新手,有些概念对我来说还不是很清楚。我想使用 MemSQL 来存储稀疏矩阵。
该表看起来像这样:
CREATE TABLE matrix (
r_id INT,
c_id INT,
cell_data VARCHAR(10),
KEY (`r_id`, `c_id`) USING CLUSTERED COLUMNSTORE,
);
查询:
SELECT c_id, cell_data FROM matrix WHERE r_id=<val>;
即整行SELECT r_id, cell_data FROM matrix WHERE c_id=<val>;
即整列SELECT cell_data FROM matrix WHERE r_id=<val1> AND c_id=<val2>;
即一个细胞UPDATE matrix SET cell_data=<val> WHERE r_id=<val1> AND c_id=<val2>;
INSERT INTO matrix VALUES (<v1>, <v2>, <v3>);
查询 1 和 2 的频率大致相同,查询 3、4 和 5 的频率也相同。Q1,2 之一与 Q3,4,5 之一同样频繁(即 Q1,2:Q3,4,5 ~= 1:1)。
我确实意识到一次插入一行到列存储会为每个插入创建行段组,从而降低性能。我无法批量插入。我也不能使用内存行存储(矩阵太大)。
我有三个问题:
cell_data
如果仅更改(即 Q4),单行插入的问题是否也涉及更新?是否有可能在内存行表中进行插入(?和更新?)操作并定期将内容批处理到列表?
- 如果我需要最新数据(?UNION ALL?),我将如何执行 Q1,2?
- 是否可以避免为两个表执行 Q3(?这意味着两次往返?)?
我担心 Q1 和 Q2 的执行速度。Clustered 键对于那些是最优的。我不确定如何使用上面的表格存储记录。