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

标签 mysql load-data-infile batch-insert

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

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

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

我正在使用 MySQL 数据库,哪种方法更适合我,LOAD DATABATCH 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/

相关文章:

mysql - 如何获取每组mysql查询中第n个最高的条目

php - 使用一个选择查询选择 2 个表

Java/Spring JDBC : Batch Insert into 2 Tables: Obtain FK ID from 1st Batch Insert Required for 2nd Table

java - Neo4j 中批量插入期间的数字索引

laravel - Laravel 5.2 中的批量插入

php - mysqli_stmt::bind_param() - 为每个参数指定除 "s"之外的另一种数据类型

mysql - mssql 和 mysql 区分大小写,例如

mysql - 防止 LOAD DATA INFILE 转义双引号

当仍需要实时 SELECT 查询时 MySQL 锁定处理大型 LOAD DATA INFILE

php - 从 PHP 将上传的 CSV 导入 MySQL 表时更正 LINES TERMINATED BY