【问题标题】:Individiaul MySQL INSERT statements vs writing to local CSV first and then LOAD DATA单个 MySQL INSERT 语句与先写入本地 CSV 再写入 LOAD DATA
【发布时间】:2016-11-19 23:11:45
【问题描述】:

我正在尝试将 5000 万个 HTML 文件中的信息提取到 MySQL 数据库中。我的问题是我应该在这个过程中的什么时候将信息存储到 MySQL 数据库中。例如,我正在考虑以下选项:

  1. 打开每个文件并提取我需要的信息。解析每个文件后执行 INSERT。
  2. 打开每个文件并提取我需要的信息。作为中介,将信息存储到 CSV 文件中。将所有文件解析为 CSV 后,使用 LOAD DATA INFILE 执行批量上传

我知道 LOAD DATA INFILE 比单独的 INSERT 语句要快得多,如果我已经有 CSV 中的信息。但是,如果我没有 CSV 中已有的信息,我不知道先创建 CSV 是否更快。

问题的关键在于:写入本地 CSV 是更快还是与单个 INSERT 语句大致相同?

我正在使用 PHP,以防万一。提前致谢!

【问题讨论】:

  • 这是一个折腾。 CSV 具有写入文件的额外开销,但在执行实际插入时更快。
  • 这不是问题。您的大部分时间将花在打开文件和解析它们上,而不是花在 INSERTs/LOAD 上。

标签: mysql performance csv


【解决方案1】:

他们的关键不是每个条目执行一次插入,而是批处理内存中的条目然后执行批处理插入。

见:https://dev.mysql.com/doc/refman/5.7/en/insert.html

使用 VALUES 语法的 INSERT 语句可以插入多行。为此,请包含多个列值列表,每个列表都包含在括号中并用逗号分隔。示例:

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

像 SQLAlchemy 或 Hibernate 这样的 ORM 足够智能(取决于配置)可以自动批量插入。

【讨论】:

  • 我建议每批 100 到 1000 行。
猜你喜欢
  • 2020-04-09
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
  • 2015-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多