Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用java将海量数据存储到mysql的最佳方法_Java_Mysql_Database - Fatal编程技术网

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

使用java将海量数据存储到mysql的最佳方法,java,mysql,database,Java,Mysql,Database,我是一名Java开发人员。我想知道使用Java将海量数据存储到mysql中的最佳方法是什么 巨大:每秒20万条聊天信息 这里不需要索引 我应该在用户创建消息后立即将其存储到数据库中吗?它会太慢吗?你必须绝对使用MySQL,还是你也对其他数据库开放?MongoDb或CouchDB将非常适合此类需求。如果您对其他DB选项持开放态度,请查看它们 如果您必须完全使用MySql,那么我们已经做了类似的事情,所有相关的文本消息都作为单个json放在一个子系统中。我们每次都附加到它,并将master保存在一个

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

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

这里不需要索引


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

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

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

希望这有帮助


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

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

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

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


您可能还应该了解哪些是在编写时考虑了繁重的编写负载的

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

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

  • 要为邮件使用哪种类型的存储

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


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

    我的建议也是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);
    
    这是好的开始。您可以从下载MongoDB


    关于MongoDB的优化,请参考此内容。

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

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

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

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

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

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


    我的2美分。

    如果你插入了那么多数据;我认为在某个时候需要一个索引!有了这么大的数据量,我就不会逐个插入消息,批量导入的性能会更好。您可能希望使用
    insert delayed
    ,但这对于nosql来说可能是一个更好的任务。我可以推荐mongodb吗?请提供有关此问题的更多信息。典型的“谈话信息”有多大?一旦这些消息进入数据库,您需要以什么方式检索它们?当然,每秒20万则意味着每天超过170亿条信息。真的吗?也许在谈话信息中说几句话。对不起,一年大约有10亿条信息day@OllieJonesWell. 没有什么能保证自动成功。但是NoSql DBs在我的POV中是为这些需求而设计的。如果我使用MongoDb存储数据,它会丢失内存缓存中的数据吗?当我重新部署项目时@Ram GFelix,不,你不会丢失任何数据。它们被持久化到文件系统,而不仅仅是内存中。您还可以复制数据。请在MongoDB存储上查看这一点。在阅读了这些答案后,我发现了一些关于MongoDB的文章。我发现当内存变大时,MongoDB的速度会变慢,并且我有很多消息要插入,因此会占用太多内存。是吗