有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

巨大:每秒20万条聊天信息

这里不需要索引

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


共 (5) 个答案

  1. # 1 楼答案

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

    行的数量很大,并且您的数据没有太多的关系。这非常适合于非关系数据库

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

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

    另请注意:就每秒需要20万条消息的用户而言,您的应用程序的成功程度如何?一个活跃的聊天会话可能会每5秒从一个用户那里生成一条消息。为了便于计算,我们将其设为1秒。因此,您正在为200K在线用户建设容量。这意味着你至少会有几百万用户

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

    我的2美分

  2. # 2 楼答案

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

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

    2. 消息要使用哪种类型的存储器

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

    就数据存储而言,MySQL是一个关系数据库,但听起来并不是真正在进行任何关系数据处理,而只是存储大量数据。我建议查看NoSQL数据库(正如其他人在这里所建议的那样),如MongoDB、Cassandra、CouchDB等。它们各有优缺点(您可以在各自的网站和internet上的其他地方了解更多)

  3. # 3 楼答案

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

  4. # 4 楼答案

    10亿次写入/天约为每秒12000次。假设每条消息大约有16个字节,大约是200k/秒。如果您不关心读取,您可以很容易地以这种速率将其写入磁盘,可能每行一条消息。您的读访问模式可能决定了您最终需要在这里做什么

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

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

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

  5. # 5 楼答案

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

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

    希望这有帮助

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