【问题标题】:best way to store huge data into mysql using java使用java将大量数据存储到mysql的最佳方法
【发布时间】:2012-07-24 01:10:49
【问题描述】:

我是一名 Java 开发人员。我想知道使用 Java 将大量数据存储到 mysql 的最佳方法是什么。

巨大:每秒 20 万条谈话消息。

这里不需要索引

我应该在用户创建消息后立即将消息存储到数据库中吗?会不会太慢了?

【问题讨论】:

  • 如果你要插入那么多数据;我认为在某些时候需要一个索引!有了这么多的数据,我不会通过消息插入来做消息,批量导入会更好。
  • 您可能想使用insert delayed,但这对于 nosql 来说可能是一个更好的任务。我可以推荐 mongodb 吗?
  • 请提供有关此问题的更多信息。典型的“谈话信息”有多大?一旦这些消息在您的数据库中,您需要以什么方式检索这些消息?当然,每秒 20 万条消息是每天超过 170 亿条消息。真的吗?
  • 谈话信息中可能只有几句话。抱歉,每天大约有 10 亿条消息@OllieJones

标签: java mysql database


【解决方案1】:

10 亿次写入/天约为 12k/秒。假设每条消息大约 16 个字节,那就是大约 200k / sec。如果您不关心阅读,您可以以这种速度轻松地将其写入磁盘,也许每行一条消息。您的读取访问模式可能会决定您最终需要在这里做什么。

如果您使用 MySQL,我建议尽可能每行合并多条消息。对表进行分区有助于将工作集保留在内存中,并且您需要为每个事务提交许多记录,可能是 1000 行。您需要进行一些测试和调整,此页面会很有帮助:

http://dev.mysql.com/doc/refman/5.0/en/insert-speed.html

您可能还应该查看Cassandra,它是在考虑到大量写入工作负载的情况下编写的。

【讨论】:

  • 10 亿次写入/天 mysql 或其他 nosql 数据库?
  • @Felix,每天 10 亿次写入来自您对原始问题的评论。 MySQL 不太可能是理想的,但您没有提供足够的信息,您将如何使用这些数据来提出更具体的建议。
【解决方案2】:

我的建议也是 MongoDB。由于 NoSQL 范式完全符合您的需求。 下面是 Java 中的 MongoDB -

BasicDBObject document = new BasicDBObject();
document.put("database", "mkyongDB");
document.put("table", "hosting");

BasicDBObject documentDetail = new BasicDBObject();
documentDetail.put("records", "99");
documentDetail.put("index", "vps_index1");
documentDetail.put("active", "true");

document.put("detail", documentDetail);

collection.insert(document);

这个tutorial 是一个很好的开始。你可以从github下载MongoDB。

MongoDB的优化请参考post

【讨论】:

  • 在我阅读了这些答案后,我发现了一些关于 MongoDB 的文章。我发现当内存变大时,MongoDB 会很慢,我要插入很多消息,所以会占用太多内存。有没有任何解决方案?服务器内存有限:(
  • 您是否通过编写测试对其进行了测试?我建议你模拟一下你的情况并进行测试。
【解决方案3】:

您是否必须绝对使用 MySQL,或者您是否也对其他数据库开放? MongoDb 或 CouchDB 将非常适合这些需求。如果您对其他数据库选项持开放态度,请查看它们。

如果你必须完全使用 MySql,那么我们已经做了类似的事情,所有相关的文本消息都作为单个 json 进入一个孩子。我们每次都附加到它,并将 master 保存在一个单独的表中。因此,当消息超过一定数量(在我们的场景中为 30)时,至少有一个主记录和一个子记录以及更多的子记录,实现了一种“加载更多..”查询第二个子记录,其中包含 30 个以上。

希望这会有所帮助。

仅供参考,出于其他一些原因和需求,我们正在迁移到 CouchDB。

【讨论】:

  • 好吧。没有什么能保证自动成功。但是 NoSql DB 是为我 POV 中的这类需求而设计的。
  • 如果我使用MongoDb存储数据,它会丢失内存缓存中的数据吗?当我重新部署项目时。 @Ram G
  • Felix,不会。您不会丢失任何数据。它们被持久化到文件系统,而不仅仅是在内存中。你也可以复制数据。
  • 在 MongoDB 存储上查看此内容。 stackoverflow.com/questions/4127386/…
【解决方案4】:

这个问题至少有两个不同的部分:

  1. 处理消息以存储在数据库中

  2. 消息使用什么类型的存储

为了处理消息,您可能需要一个水平可扩展的系统(这意味着您可以添加更多机器来快速处理消息),这样您就不会积累大量积压的消息。您绝对不应该尝试同步写入这些消息,而是在收到消息时将其放在队列中以进行处理以写入数据库(这里想到 JMS 之类的东西)。

在数据存储方面,MySQL 是一个关系型数据库,但听起来你并不是真的在做任何关系型数据处理,而只是在存储大量数据。我建议研究 NoSQL 数据库(正如其他人在这里所建议的那样),例如 MongoDB、Cassandra、CouchDB 等。它们各有优缺点(您可以在各自的网站和其他地方阅读有关它们的更多信息)互联网)。

【讨论】:

    【解决方案5】:

    我猜,典型的访问至少需要检索一个聊天会话的所有文本。

    行数很大,并且您的数据不是那么相关。这非常适合非关系数据库。

    如果您仍想使用 MySQL,请使用分区。写入时使用批量插入,读取时在查询中提供足够的分区修剪提示。使用EXPLAIN PARTITIONS 检查分区是否正在被修剪。在这种情况下,我强烈建议您将一个聊天会话的聊天行合并为一行。与每行一条聊天线相比,这将大大减少行数。

    您没有提到要存储多少天的数据。

    另外说明:就用户而言,您的应用必须在多大程度上成功才能要求每秒 20 万条消息?一个活跃的聊天会话可能每 5 秒从一位用户生成大约 1 条消息。为便于计算,我们将其设为 1 秒。因此,您正在为 20 万 在线 用户构建容量。这意味着您至少会有几百万用户。

    尽早考虑规模是件好事。但是,这需要工程上的努力。由于资源有限,请为每项任务(性能/用户体验等)仔细分配它们。例如,在用户体验上花费更多时间可能会产生更好的投资回报率。当你到达数百万用户的领域时,新的大门将会打开。你可能会得到天使或风险投资的资助。认为这是一个很好的问题。

    我的 2 美分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-26
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 2018-07-25
      • 2012-01-15
      相关资源
      最近更新 更多