1

我正在开发用于进行在线调查的软件。当许多用户同时填写调查时,我在处理高数据库写入负载时遇到了麻烦。我当前用于存储调查数据的表(MySQL、InnoDB)具有以下列:dataID、userID、item_1 .. item_n。item_* 列具有不同的数据类型,对应于使用特定项目获取的数据类型。大多数项目列是 TINYINT(1),但也有一些 TEXT 项目列。大型调查可以有一百多个项目,导致一个包含一百多个列的表。用户在一篇 http 帖子中回答了大约 20 个项目,相应的行必须相应更新。用户可能会跳过很多项目,导致行中有很多 NULL 值。

我正在考虑以下解决方案来解决我的写入负载问题。我没有使用包含许多列的单个表,而是设置了与使用的数据类型相对应的几个表,例如:data_tinyint_1、data_smallint_6、data_text。这些表中的每一个都只有以下列:userID、itemID、value(value 列具有与其表对应的数据类型)。对于一个包含例如 20 个项目的 http 帖子,我可能必须在 data_tinyint_1 中创建 19 行,在 data_text 中创建 1 行(而不是更新具有许多列的大行)。但是,对于每个项目,我需要确定它的数据类型(通过两个表连接),以便我知道在哪个表中创建新行。使用这种方法,我的基于 zend 框架的应用程序代码将变得更加复杂。

我的问题:

  1. 对于繁重的写入负载,我的解决方案会更好吗?
  2. 你有更好的解决方案吗?
4

2 回答 2

2

由于您已经到了抽象此模式以模仿实际数据类型的地步,因此您应该简单地为每个调查创建新表集,这可能是有道理的。好处是锁定会减少,如果负载变得无法承受,您可以将重负载隔离到外部机器。

单一调查数据库结构可以更准确地反映您的真实世界条件和数据输入处理程序。它应该让你的抽象头痛消失。

动态创建表没有任何问题。在某些配置中,软分片是优选的。

于 2012-05-08T15:54:59.583 回答
1

这看起来很明显的解决方案是使用文档数据库进行快速写入,然后使用 cron 或类似的东西异步批量插入 MySQL 的答案。您可以在文档数据库中创建视图以进行快速统计,但如果您不喜欢文档 DBMS,则只能在 MySQ 中进行过滤和其他复杂的操作。

于 2012-05-14T16:07:42.470 回答