2

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

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

这里不需要索引

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

4

5 回答 5

1

我的建议也是 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);

教程非常适合入门。您可以从github下载 MongoDB 。

有关 MongoDB 的优化,请参阅这篇文章

于 2012-07-24T02:52:08.787 回答
1

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

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

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

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

于 2012-07-24T02:30:47.090 回答
0

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

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

  2. 用于消息的存储类型

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

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

于 2012-07-24T02:44:11.120 回答
0

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

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

希望这可以帮助。

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

于 2012-07-24T01:20:27.173 回答
0

我想,典型的访问将涉及至少检索一个聊天会话的所有文本。

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

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

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

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

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

我的 2 美分。

于 2012-07-24T04:46:01.627 回答