【问题标题】:MySql, LOAD DATA or BATCH INSERT or any other better way for bulk insertsMySql、LOAD DATA 或 BATCH INSERT 或任何其他更好的批量插入方式
【发布时间】:2013-01-19 11:19:40
【问题描述】:

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

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

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

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

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

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

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

Ollie Jones,这里是您问题的某些答案

谢谢!

【问题讨论】:

  • 您的性能要求是什么? (“快速”不是一个可用的性能规范,当您每批处理一个兆行时。)您可以将您的请求(批次)排队,以便您的系统一次处理一批吗?您的应用程序将如何检索此信息?信息的检索是否需要与新数据的插入同时进行?你的表定义是什么?
  • @Ollie Jones,我已经编辑了我的问题。请检查谢谢!

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


【解决方案1】:

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

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

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

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

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

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

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

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

鉴于您在此处提到的数据量,如果您要使用实时数据进行生产,您可能需要考虑使用 ActiveMQ 等排队系统,而不是 DBMS。

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

【讨论】:

  • 会尝试实现ConcurrentLinkedQueue。这肯定比进行任何数据库活动更有效。谢谢奥利
猜你喜欢
  • 2011-09-11
  • 1970-01-01
  • 2019-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多