我正在研究存储“大量”数据并且不确定最佳解决方案是什么,因此任何帮助都将非常受欢迎。数据的结构是
450,000行 11,000列
我的要求是:
1)需要尽可能快地访问数据的一小部分,例如行(1,2,3)和列(5,10,1000) 2)需要可扩展的是每月添加列,但行数是固定的。
我的理解是,最好将其存储为:
ID | ROW_NUMBER | COLUMN_NUMBER栏|值
但这会产生4,950,000,000个条目?我已经尝试像MySQL那样只存储行和列,但在数据子集方面它很慢。
谢谢!
答案 0 :(得分:0)
构建巨型矩阵表
作为N.B.在评论中说,没有比为每个矩阵值使用一个mysql 行更简洁的方法。 您可以在没有id列的情况下执行此操作:
CREATE TABLE `stackoverflow`.`matrix` (
`rowNum` MEDIUMINT NOT NULL ,
`colNum` MEDIUMINT NOT NULL ,
`value` INT NOT NULL ,
PRIMARY KEY ( `rowNum`, `colNum` )
) ENGINE = MYISAM ;
如果您经常逐列访问(UNIQUE INDEX
,则可以在colNum, rowNum
上添加INDEX
,或在colNum
上添加非唯一PRIMARY INDEX
( `rowNum`, `colNum` )
在CREATE TABLE `stackoverflow`.`cachedPartialMatrix` (
`rowNum` MEDIUMINT NOT NULL ,
`colNum` MEDIUMINT NOT NULL ,
`value` INT NOT NULL ,
PRIMARY KEY ( `rowNum`, `colNum` )
) ENGINE = MYISAM ;
上,请注意顺序,因此在选择整列时效率会很低。)
您可能需要超过200Go才能存储450.000x11.000行,包括索引。
插入数据可能很慢(因为有两个索引需要重建)。
添加缓存
由于您说添加值,并且似乎没有编辑矩阵值,因此缓存可以加快频繁询问的行/列。
如果您经常读取相同的行/列,则可以将结果缓存到另一个表中(相同的结构使其更容易):
matrix
该表在开头将无效,matrix
表上的每个SELECT都将提供缓存。当你想得到一个列/行时:
matrix
表上执行SELECT CREATE TABLE `stackoverflow`.`requestsCounter` (
`isRowSelect` BOOLEAN NOT NULL ,
`index` INT NOT NULL ,
`count` INT NOT NULL ,
`lastDate` DATETIME NOT NULL,
PRIMARY KEY ( `isRowSelect` , `index` )
) ENGINE = MYISAM ;
表保存到cachingPartialMatrix 更智能的缓存
您可以使用第三个表格更智能地计算选择完成次数:
lastDate
当您对矩阵(可以使用TRIGGERS
)请求第N行或第K列时,请递增计数器。当计数器变得足够大时,请提供缓存。
{{1}}可用于从缓存中删除一些旧值(注意:如果从缓存条目中删除第N列,因为它的``lastDate```足够老,你可能会破坏其他一些条目缓存)或定期清除缓存,只留下最近选择的值。