我用 C 语言编写了一个程序来解析大型 XML 文件,然后使用插入语句创建文件。其他一些进程会将文件摄取到 MySQL 数据库中。这些数据将用作索引服务,以便用户可以轻松找到文档。
我选择 InnoDB 是因为它具有行级锁定的能力。C 程序将在给定调用上生成 500 到 500 万条插入语句。
尽快将所有这些数据输入数据库的最佳方法是什么?要注意的另一件事是数据库位于单独的服务器上。是否值得将文件移动到该服务器以加快插入速度?
编辑:该表不会真正更新,但行将被删除。
我用 C 语言编写了一个程序来解析大型 XML 文件,然后使用插入语句创建文件。其他一些进程会将文件摄取到 MySQL 数据库中。这些数据将用作索引服务,以便用户可以轻松找到文档。
我选择 InnoDB 是因为它具有行级锁定的能力。C 程序将在给定调用上生成 500 到 500 万条插入语句。
尽快将所有这些数据输入数据库的最佳方法是什么?要注意的另一件事是数据库位于单独的服务器上。是否值得将文件移动到该服务器以加快插入速度?
编辑:该表不会真正更新,但行将被删除。
我会根据这个链接至少做这些事情:
只要是只写表,具有标准表格式的 MySQL 就非常快;所以第一个问题是你是要更新还是删除。如果没有,请不要使用 innosys - 如果您只是附加,则无需锁定。您可以定期截断或重命名输出文件以处理表大小。
交易消除了
插入,同步到磁盘
重复阶段,而是在您提交事务时执行所有磁盘 IO。
原始文本 + GZip 压缩流 ~= 在某些情况下节省多达 90% 的带宽。
INSERT INTO TableName(Col1,Col2) VALUES (1,1),(1,2),(1,3)
(要发送的文字更少,动作更短)
如果您不能像其他人建议的那样使用 LOAD DATA INFILE,请使用准备好的查询进行插入。
真的取决于发动机。如果您使用 InnoDB,请使用事务(您无法避免它们 - 但如果您使用自动提交,每个批次都隐含在其自己的 txn 中),但要确保它们既不太大也不太小。
如果您使用的是 MyISAM,则交易毫无意义。您可以通过禁用和启用索引来获得更好的插入速度,但这仅适用于空表。
如果你从一张空桌子开始,那通常是最好的。
无论哪种方式,加载数据都是赢家。