我是一名Java开发人员。我想知道使用Java将大量数据存储到mysql的最佳方法是什么。
巨大:每秒钟有20万条谈话消息。
此处不需要索引
我应该在用户创建消息后立即将消息存储到数据库中吗?会不会太慢?
答案 0 :(得分:1)
如果你使用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)
此问题至少有两个不同的部分:
处理要在数据库中存储的消息
用于消息的存储类型
为了处理消息,您可能需要一个水平可扩展的系统(这意味着您可以添加更多计算机来快速处理消息),因此您不会积累大量的消息积压。你绝对不应该尝试同步编写这些消息,而是在收到消息时,将它放在队列中进行处理以写入数据库(这里可以想到JMS之类的东西)。
在数据存储方面,MySQL是一个关系型数据库,但它听起来并不像是在进行任何关系数据处理,而只是存储大量数据。我建议查看一个NoSQL数据库(正如其他人在这里建议的那样),例如MongoDB,Cassandra,CouchDB等。它们各有各的优点和缺点(你可以在各自的网站和其他地方阅读更多关于它们的信息。互联网)。
答案 4 :(得分:0)
我想,典型的访问权限至少会涉及检索一个聊天会话的所有文本。
行数很大,而且您的数据不是那么关系。这非常适合非关系数据库。
如果您仍想使用MySQL,请使用分区。在编写时,使用批量插入并在读取时在查询中提供足够的分区修剪提示。使用EXPLAIN PARTITIONS
检查是否正在修剪分区。在这种情况下,我强烈建议您将一个聊天会话的聊天行合并为一行。与每行一个聊天行相比,这将显着减少行数。
您没有提到要存储多少天的数据。
单独注意:您的应用在用户方面每秒需要200k消息的成功程度如何?活动聊天会话可以每5秒从一个用户生成大约1条消息。为了便于计算,让它1秒钟。因此,您正在为200,000 在线用户构建容量。这意味着你至少会有几百万用户。
早期考虑规模是好的。但是,它需要工程努力。由于资源有限,请为每项任务(性能/用户体验等)仔细分配。例如,在UX上花费更多时间可能会产生更好的投资回报率。当您达到数百万用户区域时,将打开新门。您可能由天使或VC资助。把它想象成一个好问题。
我的2美分。