在数据库中存储整数数组

时间:2011-06-27 11:11:35

标签: performance database sql

我正在创建一个将存储100.000(以及将来可能更多)用户的数据库。虽然这显然发生在每个用户有1行的表中,但每个用户都可以(并且将会)存储数百个项目。在编程语言中,这意味着用户有2个整数数组(或一个二维数组):itemid的列和数量的列。

我的直觉告诉我要创建一个表来保存所有这些项目,其行如(userid,itemid,amount)。然而,这将导致一个巨大的表。 200.000个用户,每个250个项目......一个表中有5000万个条目。这一点,加上桌子将经历连续快速的变化,让我感到害怕。 (有多快?我估计每秒最多100次修改。)

通常会有100到2000个用户,包括添加和删除项目以及修改金额。这些操作可以并且将在编程代码中发生。它将如下:

  • 用户启动会话,程序加载数据库中的所有用户项
  • 用户修改项目列表
  • 每隔几分钟,更改将保存到数据库中
  • 当用户结束会话时,它也会保存到数据库中

值得注意的是,用户可以存储的项目数量最多。

有没有其他方法可以使用单独的表格?也许将值保存在格式化的文本字符串中?或者这是使用MySQL数据库实际上是Bad Idea™的实例之一吗?

感谢您的时间和见解。

3 个答案:

答案 0 :(得分:5)

  

我的直觉告诉我要创建一个表来容纳所有这些项目

你的直觉是正确的。

1)避免过早优化

2)除非你有一个非常好的理由,否则不要违反规范化规则

3)为什么你怀疑多表方法会更快?

  

一个表中有5000万个条目

那又怎样?即使您只有userid索引,与每个用户的单个表相比,性能差异也不会明显变慢(实际上,有200,000个用户,它会更快,更快 - 因为DBMS可以轻松地保持开放状态每个表的文件句柄!)。

  

我估计每秒最多100次修改

应该可以使用MySQL和相当基本的硬件,但如果是我,我想要一点空间,我会选择一对镜像SATA磁盘,一面镜子上的表,另一面上的索引。 / p>

我唯一关心的问题(无论你选择哪两个模型都适用)都支持2000个并发连接。连接必须是并发的吗?或者每个用户是否可以下载工作集(可选择使用乐观锁定策略)并关闭连接,然后在新连接上推回更改?如果没有,那么你可能想要一个很好的内存和CPU重击。

但是不管是使用一个大表还是许多小表,如果这是数据的唯一用途,并且访问不是与特定数据项并发,那么为什么还要使用关系数据库呢? NoSQL或共享文件系统也可以正常工作。

答案 1 :(得分:1)

将数据作为数组放入一个字段几乎总是一个错误。它使得查询数据更加困难,耗时更多,并且使用索引的可能性也大大降低。没关系,如果值只是文本,你永远不需要找到数组的一个或多个元素,但我的经验是很少遇到这种情况。现代数据库可以处理5000万条记录,甚至不会出汗。这是daatbase术语中的一个小表。

答案 2 :(得分:0)

如您所描述的那样使用两个表格应该可以。数据库应该能够处理数百万条记录。

要注意的重点:

1-尽可能优化您的查询。

2-创建适当的索引以加快查询速度。

3-如果您有并发读取/更新操作,请使用InnoDB,因为它支持行级锁定而不是MyISAM。

4-提供良好的硬件来支持数据库服务器。

5-如果价格合理,请在专用服务器上运行数据库服务器。