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

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

【问题讨论】:

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

标签: php javascript mysql ajax


【解决方案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?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-04-27
          • 2018-10-19
          • 2018-03-30
          • 1970-01-01
          • 2014-04-10
          • 1970-01-01
          • 1970-01-01
          • 2019-03-30
          相关资源
          最近更新 更多