MySql,LOAD DATA或BATCH INSERT或任何其他更好的批量插入方式

时间:2013-01-19 11:19:41

标签: mysql load-data-infile batch-insert

我正在尝试创建一个Web应用程序,主要目标是将请求数据插入数据库。

这是我的问题,一个请求本身包含10,000到1,00,000个数据集信息 (每个数据集需要作为数据库中的一行单独插入)

我可能会同时在此应用程序上收到多个请求,因此我需要快速插入。

我正在使用MySQL数据库,哪种方法对我来说更好,LOAD DATABATCH INSERT还是有比这两种更好的方式?

您的应用程序将如何检索此信息?   - 将有另一个基于后台线程的java应用程序,它将从该表中选择记录逐个处理并删除它们。

您可以将请求(批次)排队,以便您的系统一次处理一批吗?   - 目前我们正考虑将其直接插入数据库,但是如果这种方法不够可行,我们可能会想到排队数据。

信息检索是否需要与插入新数据同时进行?   - 是的,我们保持同步。

以下是您的问题的某些答案,Ollie Jones

三江源!

1 个答案:

答案 0 :(得分:1)

Ken White的评论提到了一些有用的SO问题和处理批量插入的答案。对于您正在处理的记录量,通过使用MyISAM表和LOAD DATA INFILE数据加载,您可以从MySQL服务器使用的同一文件系统中的源文件中获得最佳成功。

你在这里做的是一种排队操作。你收到这些批次(你称之为“请求”)的记录(你称之为“数据集”。)你把它们放入一个大桶(你的MySQL表)。然后你一次把它们从桶中取出。< / p>

你没有完全描述你的问题,所以我的建议可能是错误的。

每条记录(“数据集”)是否独立于所有其他记录?

处理记录的顺序是否重要?或者,如果您以随机顺序处理它们,您会获得相同的结果吗?换句话说,您是否必须维护单个记录的订单?

如果您几乎同时收到两百万行批次(“请求”)会怎样?假设您可以每秒加载一万条记录(这很快!)到MySQL表中,这意味着完全加载两个批次需要200秒。在开始加载第二批之前,您是否会尝试完全加载一个批次?

在批量完全加载之前,是否可以开始处理和删除这些批次中的行?

记录在处理之前在系统中停留200秒或更长时间是否可以?唱片能坐多长时间? (这称为“延迟”)。

考虑到你在这里提到的数据量,如果你要使用生活数据进行生产,你可能需要考虑使用像ActiveMQ这样的排队系统而不是DBMS。

仅仅构建一个多线程Java应用程序来加载批量记录,将它们存放到RAM中的Queue对象(ConcurrentLinkedQueue实例可能是合适的)并逐个处理它们也是有意义的。 。通过将MySQL表用作队列,这种方法可以让您更好地控制系统性能。