我正在尝试创建一个网络应用程序,主要目标是将请求数据插入数据库。
这是我的问题,一个请求本身包含 10,000 到 1,00,000 个数据集信息 (每个数据集需要单独作为一行插入数据库)
我可能会同时收到此应用程序上的多个请求,因此我有必要加快插入速度。
我正在使用 MySQL 数据库,哪种方法更适合我,LOAD DATA
或 BATCH INSERT
还是有比这两种更好的方法?
您的应用程序将如何检索此信息? - 将有另一个基于后台线程的java应用程序将从该表中选择记录,一一处理它们并删除它们。
您能否对您的请求(批处理)进行排队,以便您的系统一次处理一批? - 目前我们正在考虑将其直接插入数据库,但是如果这种方法不够可行,我们可能会考虑对数据进行排队。
信息检索是否需要与新数据插入同时进行? - 是的,我们保持并发。
奥利·琼斯,这是您问题的某些答案
谢谢!
最佳答案
Ken White 的评论提到了一些处理批量插入的有用的 SO 问题和答案。对于您正在处理的记录量,您将通过使用 MyISAM 表和 LOAD DATA INFILE
数据加载(从 MySQL 服务器使用的同一文件系统中的源文件)获得最大的成功。
您在这里所做的是一种排队操作。您收到这些批处理(您称之为“请求”)的记录(您称之为“数据集”)。您将它们放入一个大桶(您的 MySQL 表)中。然后一次一个地将它们从桶中取出。
您没有完整描述您的问题,因此我的建议可能是错误的。
每条记录(“数据集”)是否独立于所有其他记录?
记录的处理顺序重要吗?或者如果您以随机顺序处理它们,您会得到相同的结果吗?换句话说,您是否必须维护各个记录的顺序?
如果您大约在同一时间收到两百万行批处理(“请求”),会发生什么情况?假设您每秒可以将一万条记录加载到您的 MySQL 表中(这很快!),这意味着完全加载这两个批处理将需要 200 秒。您会在开始加载第二批之前尝试完全加载一批吗?
在批处理完全加载之前开始处理并删除这些批处理中的行是否可以?
记录在处理之前可以在系统中保留 200 秒或更长时间吗?一张唱片可以保存多久? (这称为“延迟”)。
考虑到您在这里提到的数据量,如果您要使用实时数据进行生产,您可能需要考虑使用 ActiveMQ 等排队系统,而不是 DBMS。
构建一个多线程 Java 应用程序来加载批量记录、将它们存入 RAM 中的 Queue 对象(ConcurrentLinkedQueue
实例可能合适)并处理它们也可能是有意义的逐个。与使用 MySQL 表作为队列相比,这种方法可以让您更好地控制系统的性能。
关于MySql、LOAD DATA 或 BATCH INSERT 或任何其他更好的批量插入方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14413785/