在 mysql 表中上传大约 10,000,000 条记录的大型 CSV 文件,它还包含重复的行

Posted

技术标签:

【中文标题】在 mysql 表中上传大约 10,000,000 条记录的大型 CSV 文件,它还包含重复的行【英文标题】:Upload large CSV file approx 10,000,000 records in mysql table also it contain duplicate rows 【发布时间】:2011-11-27 05:08:57 【问题描述】:

我想在 mysql 表中上传一个大约 10,000,000 条记录的大型 csv 文件,其中还包含相同或更多的记录。的记录和一些重复的记录。 我尝试了本地数据文件,但它也需要更多时间。 我怎样才能在不等待很长时间的情况下解决这个问题。 如果无法解决,那么我该如何使用 AJAX 发送一些记录并一次处理它,直到整个 csv 上传/处理为止。

【问题讨论】:

你必须先解释一下你想出的这个新的数字符号。 是十亿条记录还是一千万条记录? 通过 ajax 会更慢。如果您希望加载 infile 命令不需要那么长时间,请将 csv 分成更小的块。 通过调整逗号,好像是一百万?那是对的吗?我们需要知道我们谈论的规模。 Walkerneo 这是印度的写作风格。 1000 万 = 1,00,00,000 = 1 千万。 【参考方案1】:

LOAD DATA INFILE 在速度方面不会被击败。您可以采取一些措施来加快速度:

删除或禁用某些索引(当然,您需要等待它们在加载后构建。但这通常更快)。如果你使用 MyISAM,你可以ALTER TABLE *foo* DISABLE KEYS,但很遗憾,InnoDB 不支持。您将不得不放弃它们。 优化您的 my.cnf 设置。特别是,您可以禁用许多安全功能(例如 fsync)。当然,如果发生崩溃,则必须恢复备份并重新开始加载。另外,如果你运行的是默认的 my.cnf,最后我检查了它对于数据库机器的优化程度。周围有大量调音指南。 购买更快的硬件。或者租一些(例如,尝试一个快速的 Amazon ECC 实例)。 正如@ZendDevel 提到的,如果您没有被锁定在 MySQL 中,请考虑其他数据存储解决方案。例如,如果您只是存储电话号码列表(以及其中的一些数据),则普通哈希表的速度会快很多倍。

如果问题在于它破坏了数据库性能,您可以将 CSV 文件拆分为多个 CSV 文件,然后分块加载它们。

【讨论】:

实际上我正在处理呼叫中心的手机号码白名单解决方案,我每天都必须上传这么多数据(那里有重复的行)。 @user969923:听起来你可以结合优化 my.cnf(如果尚未完成)和购买更快的硬件。 Serverfault 人员可能会在细节方面为您提供更多帮助。 如何使用 HASH TABLE。我只有 5 个字段,只有一个是主键(手机号码)。举个例子吧。 @user969923:哈希表,就像数据结构中的一样(有时也称为哈希映射):en.wikipedia.org/wiki/Hash_table 请记住,前提是您没有被锁定在 MySQL 中。如果您使用简单的哈希表,以及许多可用库之一,它至少比 MySQL 快几个数量级。您为该性能牺牲了很多灵活性和功能,但您肯定会获得性能。 (例如,我希望 1000 万行插入不到一分钟,如果它有很多带有这些数字的数据,可能会插入一些)【参考方案2】:

试试这个:

load data local infile '/yourcsvfile.csv' into table yourtable fields terminated by ',' lines terminated by '\r\n'

【讨论】:

OP 说他尝试过load infile,但速度太慢了。这有什么改变?【参考方案3】:

这可能需要很长时间,具体取决于您的存储引擎。我注意到使用 MISAM 会更快一些。我刚刚使用完全相同的数据集进行了测试,最后我选择了 PostgreSQL,因为它在加载文件时更加健壮。 Innodb 太慢了,我用相同大小的数据集在两个小时后中止了它,但它是 128 列的 10,000,000 条记录。

【讨论】:

【参考方案4】:

由于这是每天更新的白名单,这是否意味着存在大量重复(第一天之后)?如果是这种情况,执行一个简单的脚本会在插入之前检查记录是否已经存在,这会使上传速度更快。

【讨论】:

【参考方案5】:

试试这个查询:

$sql="LOAD DATA LOCAL INFILE '../upload/csvfile.csv' 
INTO TABLE table_name FIELDS 
TERMINATED BY ',' 
ENCLOSED BY '' 
LINES TERMINATED BY '\n' "

【讨论】:

【参考方案6】:

我意识到同样的问题并找到了出路。您可以查看使用 AJAX 上传大型 CSV 文件的过程。

How to use AJAX to upload large CSV file?

【讨论】:

以上是关于在 mysql 表中上传大约 10,000,000 条记录的大型 CSV 文件,它还包含重复的行的主要内容,如果未能解决你的问题,请参考以下文章

处理选择框中的大量数据

MySQL 优化 - 大表连接

MySQL查询没有正确使用索引?

NodeJS web-socket 服务器在大约 1,000 个连接时爆炸式增长

从 SQL Server 表中选择 n 个随机行

Azure 存储表中的批量插入