在MySQL中实现快速插入大量数据的最佳方法是什么?

时间:2008-11-24 16:05:49

标签: mysql performance load-data-infile insert

我在C中编写了一个程序来解析大型XML文件,然后使用insert语句创建文件。其他一些进程会将文件摄取到MySQL数据库中。 此数据将用作索引服务,以便用户可以轻松找到文档。

我选择了InnoDB来实现行级锁定。 C程序将在给定的调用中生成500到500万个插入语句。

将所有这些数据尽快送入数据库的最佳方法是什么?另一件需要注意的是,DB位于单独的服务器上。是否值得将文件移动到该服务器以加速插入?

编辑:此表不会真正更新,但会删除行。

6 个答案:

答案 0 :(得分:15)

  • 使用mysqlimport工具或LOAD DATA INFILE命令。
  • 暂时禁用数据完整性不需要的索引

答案 1 :(得分:2)

我根据this link至少做这些事情:

  1. 将文件移到那里并通过unix socket连接
  2. 生成LOAD DATA INFILE文件
  3. 而不是INSERTS
  4. 在加载期间禁用索引

答案 2 :(得分:1)

只要它是一个只写表,带有标准表格式的MySQL就非常快。所以第一个问题是你是要更新还是删除。如果没有,请不要使用innosys - 如果您只是追加,则无需锁定。您可以定期截断或重命名输出文件以处理表大小。

答案 3 :(得分:1)

1。确保使用交易。

交易消除了

INSERT,SYNC-TO-DISK

重复阶段,而是在COMMIT事务时执行所有磁盘IO。

2。确保使用连接压缩

原始文本+ GZip压缩流〜=在某些情况下可节省高达90%的带宽。

3。尽可能使用并行插入符号

INSERT INTO TableName(Col1,Col2) VALUES (1,1),(1,2),(1,3) 

(减少要发送的文字,缩短操作次数)

答案 4 :(得分:1)

如果您不像其他人建议的那样使用LOAD DATA INFILE,请使用准备好的插入查询。

答案 5 :(得分:1)

真的取决于引擎。如果您正在使用InnoDB,请使用事务(您无法避免它们 - 但如果您使用自动提交,则每个批处理都隐含在它自己的txn中),但要确保它们既不会太大也不会太小。

如果您使用的是MyISAM,则交易毫无意义。您可以通过禁用和启用索引来实现更好的插入速度,但这只适用于空表。

如果你从空表开始,这通常是最好的。

LOAD DATA无论如何都是胜利者。