代码之家  ›  专栏  ›  技术社区  ›  Lèse majesté

将批量数据导入mysql

  •  3
  • Lèse majesté  · 技术社区  · 14 年前

    所以我想把一些销售数据导入我的MySQL数据库。这些数据最初是原始的csv文件形式,我的PHP应用程序需要首先处理这些文件,然后将处理过的销售数据保存到数据库中。

    最初我是做个人 INSERT 我意识到查询效率非常低(大约6000个查询需要 2分钟 )然后我生成了一个大型查询, 插入 一次编辑所有数据。这使我们的效率提高了3400%,并将查询时间缩短到刚刚结束。 3秒 .

    但据我所知, LOAD DATA INFILE 应该比任何一种都快 插入 查询。所以现在我想把处理过的数据写到一个文本文件中,然后使用 加载数据填充 将其导入数据库。这是将大量数据插入数据库的最佳方法吗?或者我这样做完全是错误的?

    我知道几千行主要是数字数据在总体方案中并不多,但我正在努力使这个内部网应用程序尽可能快速/响应。我还想确保这个过程的规模扩大,以防我们决定授权给其他公司。

    更新:

    所以我去测试了 加载数据填充 正如建议的那样,考虑到它可能只会给我带来边际速度的提高(因为我现在正在将相同的数据写入磁盘两次),但当它将查询时间从3300毫秒缩短到240ms时,我很惊讶。页面执行总计仍然需要约1500毫秒,但仍然比以前明显好。

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

    4 回复  |  直到 6 年前
        1
  •  4
  •   hardfork    6 年前

    LOAD DATA INFILE 速度非常快,是将文本文件导入MySQL的正确方法。这是加快数据插入速度的推荐方法之一,速度是以下方法的20倍:

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

    假设将处理过的数据写回文本文件比将其插入数据库要快,那么这是一种很好的方法。

        2
  •  3
  •   MarkR    14 年前

    加载数据或多个插入将比单个插入要好得多;加载数据将为您节省一点点,您可能不太在乎。

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

    执行大插入的大部分时间将来自构建索引,这是一个昂贵且内存密集的操作。

    如果你需要表演,

    • 索引尽可能少
    • 确保该表及其所有索引都适合您的InnoDB缓冲池(假设此处为InnoDB)
    • 只需添加更多的RAM,直到您的表适合内存,除非它变得非常昂贵(目前64G并不太贵)。

    如果你必须使用myisam,这里有一些肮脏的把戏,以使它更好,我不会进一步讨论。

        3
  •  2
  •   Andy    13 年前

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

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

    对于我的需求来说,加载数据很快,但是需要动态保存到平面文件意味着平均加载时间比大容量插入要长。此外,我不需要做超过200个查询,在我一次做这个查询之前,我现在正在扩充它们,节省的时间在几秒钟之内。

    不管怎样,希望这对你有帮助?

        4
  •  1
  •   timdev    14 年前

    你的方法应该不错。我不确定与大容量插入相比,数据填充的加载速度要快多少,但我听说了同样的事情,即它应该更快。

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