【问题标题】:100s of Tables vs Single, Large Table100 多张桌子与单张大桌子
【发布时间】:2011-07-16 03:30:44
【问题描述】:

我正在尝试解决一个问题,即我们正在分析表中的大量数据。我们需要提取这些数据的某些子集并进行分析。照原样,我相信最好是多线程化它并在最初引入尽可能多的数据并在每个区域上执行各种计算。假设要分析的每个数据子集都表示为 S1、S2、……所以每个数据子集都有一个线程。执行计算后,可能还会创建一些可视化,并且需要将结果存储回数据库,因为分析结果中可能存在数 GB 的数据。假设结果用 R1, R2, …

表示

虽然这有点模糊,但我想知道我们是否应该为每个 R1、R2 等创建一个表,还是将所有结果存储在一个表中?很可能我们希望多个线程同时存储结果(调用 S1、S2 的线程),所以如果只有一个表,我需要确保多个线程可以同时访问它。如果它有帮助,当再次需要 R1、R2 等的数据时,所有这些都将被提取出来,并且如果每个 R1、R2 等都有一个表,则这些数据将按照易于维护的特定顺序进行。另外,我在想如果我们走那条路线,我们可以为每个表管理对特定结果表的请求的单个对象。本质上,我希望该对象像一个 bean,只在必要时从该数据库加载数据(太多以至于无法一次保存在内存中)。另一点是我们使用 InnoDB 作为我们的存储引擎,以防多个线程是否可以访问特定表有任何不同。

那么,有了这些信息,最好为结果创建一组表,还是为每个结果区域(可能是 100 个)创建一个表?

谢谢

【问题讨论】:

  • 您放入 s1、s2 等的数据是否相同?我宁愿在一个可以通过 where 子句查询的表上工作,而不是必须即时确定需要查看哪个表。尝试至少在一个表中以第一范式获取它,这样生活会更轻松。
  • 另一点是我们使用 InnoDB 作为我们的存储引擎,以防多个线程是否可以访问特定表有任何区别。 确实如此,InnoDB 具有行锁定,因此有效地允许并发访问。 (MyISAM 使用基于表的锁定)

标签: database multithreading innodb analysis


【解决方案1】:

你可以,但是你必须管理 100 张桌子。而获取整个数据集的统计数据将变得更加困难。

如果可以轻松地将数据划分为不相交的不同子集,则数据库不应锁定行,尤其是当您只是在应用程序中进行读取和处理时。在这种情况下,您不需要将表划分为数百个表,并且应用程序中的每个线程都可以独立使用。

【讨论】:

  • 猜猜问题就变成了 innodb 的 lock/acid 支持是如何工作的。
  • @pst - 差不多。这取决于如何处理行锁定以及需要什么ISOLATION LEVEL
【解决方案2】:

这听起来像是一个不错的 map reduce 候选者。这是假设您要对整个集合执行相同的计算,并且只是想加快处理速度。

您是否考虑过使用 MongoDB 之类的东西?您可以在其中编写自己的 map reduce 聚合。

地图缩减:http://en.wikipedia.org/wiki/MapReduce

mongo:http://www.mongodb.org/display/DOCS/MapReduce

Mongo 确实支持就地更新,它是一个无锁的最终一致性存储。

【讨论】:

  • 不,你弄错了。 CouchDB 是一个无锁的最终一致性存储。 MongoDB 锁死了。这是一个经典的“许多读者,一个作者”系统。写锁是服务器范围的(甚至不在数据库级别)并阻止读者。
猜你喜欢
  • 2017-02-07
  • 2011-11-17
  • 2012-05-23
  • 1970-01-01
  • 2011-09-25
  • 1970-01-01
  • 2018-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多