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

时间:2011-09-28 20:50:03

标签: php javascript mysql ajax

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

6 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:0)

试试这个:

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

答案 2 :(得分:0)

根据您的存储引擎,这可能需要很长时间。我注意到MYISAM的速度要快一些。我刚刚使用完全相同的数据集进行了测试,最后我使用了PostgreSQL,因为它在加载文件时更加强大。 Innodb非常慢,我在两个小时后使用相同大小的数据集中止了它,但是128列完整的数据是10,000,000条记录。

答案 3 :(得分:0)

由于这是一份每日更新的白名单,这并不意味着有大量重复(第一天之后)吗?如果是这种情况,它会使上传快得多,以便在插入之前检查记录是否已存在的简单脚本。

答案 4 :(得分:0)

尝试此查询:

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

答案 5 :(得分:0)

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

How to use AJAX to upload large CSV file?