在MySQL中存储一个100k×100k的数组

时间:2017-06-10 21:01:58

标签: mysql database

我需要在MySQL中存储一个庞大的固定大小的方阵。数组的值只是INT,但需要相当快速地访问和修改它们。

所以这就是我的想法:

  • 只需使用1列作为主键,并将2d数组索引转换为单维索引。 因此,如果2d数组是n乘n => 2dArray [i] [j] = 1dArray [n *(i-1)+ j]

这将问题转化为在数据库中存储大量1D数组。

  • 然后使用另一列作为值。

  • 使数组中的每个条目都成行。

但是,我对MySQL的内部工作方式不太熟悉。

100k * 100k产生100亿个数据点,超过了32位可以获得的数据点,所以我不能使用INT作为主键。在研究stackoverflow时,有些人在使用BIGINT作为主键时遇到了性能问题。

在我只存储INT的情况下,随着行数的增加,MySQL的性能会下降吗?

或者,如果我将数据分散到同一服务器上的多个表中,是否可以提高性能?现在,看起来我将无法访问多台计算机,因此我无法真正对数据进行集群。

我对上面列出的每个想法都非常灵活,并且可以接受建议(除了不使用MySQL,因为我已经致力于此了!)

1 个答案:

答案 0 :(得分:2)

至于你担心BIGINT或添加更多行会降低性能,当然这是真的。你将有100亿行,这将需要一个大表和大量的RAM。需要注意针对此数据集运行所需的查询,以确定最佳存储方法。

我可能建议使用两个列作为主键。开发人员经常忽略复合主键的可能性。

然后,如果需要,可以对两个主键列使用INT。

CREATE TABLE MyTable (
  array_index1 INT NOT NULL,
  array_index1 INT NOT NULL,
  datum WHATEVER_TYPE NOT NULL,
  PRIMARY KEY (array_index1, array_index2)
);

请注意,像这样的复合索引意味着如果在第一列上搜索没有相等条件的第二列,搜索将不会使用索引。所以如果你想支持它,你需要一个二级索引。

MySQL不支持100,000列。 MySQL有limits个4096列,每行65,535个字节(不包括BLOB / TEXT列)。

可以将数据存储在多个表中,但可能会使您的查询非常尴尬。

您还可以查看使用表格PARTITIONING,但这并不像听起来那么有用。