【问题标题】:import bulk data into MySQL将批量数据导入 MySQL
【发布时间】:2011-03-07 00:33:31
【问题描述】:

所以我正在尝试将一些销售数据导入我的 MySQL 数据库。数据最初是原始 CSV 文件的形式,我的 PHP 应用程序需要先对其进行处理,然后将处理后的销售数据保存到数据库中。

最初,我进行了单独的 INSERT 查询,我意识到这非常低效(约 6000 次查询需要将近 2 分钟)。然后我生成了一个大型查询并INSERTed 一次所有数据。这使我们的效率提高了 3400%,并将查询时间缩短到刚刚超过 3 秒

但据我了解,LOAD DATA INFILE 应该比任何类型的INSERT 查询都更快。所以现在我正在考虑将处理后的数据写入文本文件并使用LOAD DATA INFILE 将其导入数据库。这是向数据库插入大量数据的最佳方式吗?还是我完全走错了路?

我知道几千行主要是数字数据在宏伟的计划中并不算多,但我正在努力使这个 Intranet 应用程序尽可能快速/响应迅速。而且我还想确保在我们决定将程序许可给其他公司的情况下扩大这个过程。

更新:

所以我确实按照建议继续测试LOAD DATA INFILE,认为它可能只会给我带来边际速度提升(因为我现在将相同的数据写入磁盘两次),但是当它缩短查询时间时我感到很惊讶从超过 3300 毫秒降至约 240 毫秒。该页面仍然需要大约 1500 毫秒才能执行,但仍然明显比以前好。

从这里我想我会检查数据库中是否有多余的索引,并且由于我的表中除了两个之外都是 InnoDB,因此我将研究优化 InnoDB 缓冲池以优化整体性能。

【问题讨论】:

  • 我确实知道这个问题是很久以前发布的,但我不得不说一个批量 INSERT 和 LOAD DATA INFILE 之间的区别在于节省的时间。我从使用 INSERT 的 30 秒 / 更多时间到大约 10 秒加载具有 30 列 CSV 文件的 ~11000 行。

标签: php mysql performance bulkinsert


【解决方案1】:

您的方法应该没问题。我不确定 LOAD DATA INFILE 与批量 INSERT 相比要快多少,但我听说过同样的事情,它应该更快。

当然,您需要做一些基准测试来确定,但我认为编写一些测试代码是值得的。

【讨论】:

    【解决方案2】:

    LOAD DATA INFILE 非常快,是导入文本文件到 MySQL 的正确方法。这是加快数据插入速度的推荐方法之一 - 速度提高了 20 倍,据此:

    https://dev.mysql.com/doc/refman/8.0/en/insert-optimization.html

    假设将处理后的数据写回文本文件比将其插入数据库更快,那么这是一个不错的方法。

    【讨论】:

      【解决方案3】:

      LOAD DATA 或多个插入将比单个插入好得多; LOAD DATA 为您节省了一点点,您可能不太关心。

      无论如何,在一个事务中做很多但不要太多 - 每个事务 10,000 行通常感觉是正确的(注意:这与非事务引擎无关)。如果您的事务太小,那么它将花费所有时间将日志同步到磁盘。

      大部分时间进行大插入将来自构建索引,这是一项昂贵且占用大量内存的操作。

      如果您需要性能,

      • 索引尽可能少
      • 确保表及其所有索引都适合您的 innodb 缓冲池(此处假设为 innodb)
      • 只需添加更多内存,直到您的表适合内存,除非这变得过于昂贵(现在 64G 并不算太贵)

      如果你必须使用 MyISAM,这里有一些肮脏的技巧可以让它变得更好,我不会进一步讨论。

      【讨论】:

        【解决方案4】:

        伙计们,我也有同样的问题,我的需求可能比一般需求更具体一些,但我在这里写了一篇关于我的发现的帖子。

        http://www.mediabandit.co.uk/blog/215_mysql-bulk-insert-vs-load-data

        根据我的需要,加载数据很快,但需要即时保存到平面文件,这意味着平均加载时间比批量插入要长。此外,我不需要做超过 200 个查询,在我一次做一个之前,我现在正在增加它们,节省的时间大约是几秒钟。

        无论如何,希望这会对你有所帮助?

        【讨论】:

        • 有趣。对于许多用例来说,这绝对是一件好事,尽管我对你如何得到 0.0013 秒的数字有点困惑。 (我不擅长统计。)
        • Lese:这与标准差有关。我对标准偏差的理解是它显示了与平均值有多少差异。 (Excel为我做了计算)。我的观点是批量的标准偏差小于负载数据的标准偏差。对我来说,这意味着 BULK 始终更快。对我来说,这是决定这一点时最重要的因素。主要是因为这是在现场工作。希望这是有道理的?在这里查看更多信息:en.wikipedia.org/wiki/Standard_deviation
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-29
        • 2019-01-22
        相关资源
        最近更新 更多