在 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
在速度方面不会被击败。您可以采取一些措施来加快速度:
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 文件,它还包含重复的行的主要内容,如果未能解决你的问题,请参考以下文章