使用java将大量数据存储到mysql的最佳方法

时间:2012-07-24 01:10:50

标签: java mysql database

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

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

此处不需要索引

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

5 个答案:

答案 0 :(得分:1)

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

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

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

您可能还应该考虑使用大量写入工作负载编写的Cassandra

答案 1 :(得分: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);

这个tutorial非常适合入门。您可以从github下载MongoDB。

要优化MongoDB,请参阅post

答案 2 :(得分:0)

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

如果你必须绝对使用MySql,那么我们已经做了类似的事情,所有相关的文字信息都作为单个json进入孩子。我们每次都附加它,我们将主人保持在一个单独的表中。因此,一个主人和一个孩子记录最少和更多的儿童记录,因为消息超出一定数量(在我们的方案中为30),实施了一种“加载更多...”查询第二个子记录,其中包含30个以上。

希望这会有所帮助。

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

答案 3 :(得分:0)

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

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

  2. 用于消息的存储类型

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

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

答案 4 :(得分:0)

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

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

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

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

单独注意:您的应用在用户方面每秒需要200k消息的成功程度如何?活动聊天会话可以每5秒从一个用户生成大约1条消息。为了便于计算,让它1秒钟。因此,您正在为200,000 在线用户构建容量。这意味着你至少会有几百万用户。

早期考虑规模是好的。但是,它需要工程努力。由于资源有限,请为每项任务(性能/用户体验等)仔细分配。例如,在UX上花费更多时间可能会产生更好的投资回报率。当您达到数百万用户区域时,将打开新门。您可能由天使或VC资助。把它想象成一个好问题。

我的2美分。

相关问题