8

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

我选择 InnoDB 是因为它具有行级锁定的能力。C 程序将在给定调用上生成 500 到 500 万条插入语句。

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

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

4

6 回答 6

15
  • 使用 mysqlimport 工具或 LOAD DATA INFILE 命令。
  • 暂时禁用不需要数据完整性的索引
于 2008-11-24T16:13:33.410 回答
2

我会根据这个链接至少做这些事情:

  1. 将文件移到那里并通过 unix 套接字连接
  2. 生成一个LOAD DATA INFILE文件,而不是 INSERTS
  3. 在加载期间禁用索引
于 2008-11-24T16:13:28.013 回答
1

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

于 2008-11-24T16:13:47.483 回答
1

1. 确保您使用交易。

交易消除了

插入,同步到磁盘

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

2.确保使用连接压缩

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

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

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

(要发送的文字更少,动作更短)

于 2008-11-24T16:15:42.143 回答
1

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

于 2008-11-24T16:29:26.937 回答
1

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

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

如果你从一张空桌子开始,那通常是最好的。

无论哪种方式,加载数据都是赢家。

于 2008-11-24T16:51:22.727 回答