为大量大型矩阵数据设计mysql数据库

时间:2014-09-17 08:50:35

标签: mysql

我正在研究存储“大量”数据并且不确定最佳解决方案是什么,因此任何帮助都将非常受欢迎。数据的结构是

450,000行 11,000列

我的要求是:

1)需要尽可能快地访问数据的一小部分,例如行(1,2,3)和列(5,10,1000) 2)需要可扩展的是每月添加列,但行数是固定的。

我的理解是,最好将其存储为:

ID | ROW_NUMBER | COLUMN_NUMBER栏|值

但这会产生4,950,000,000个条目?我已经尝试像MySQL那样只存储行和列,但在数据子集方面它很慢。

谢谢!

1 个答案:

答案 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都将提供缓存。当你想得到一个列/行时:

  • 从该缓存表中选择行/列
  • 如果SELECT返回void / partial结果(没有返回数据或没有足够的数据来匹配预期的行/列号),那么在matrix表上执行SELECT
  • 将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```足够老,你可能会破坏其他一些条目缓存)或定期清除缓存,只留下最近选择的值。