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

在MySQL中快速插入大量数据的最佳方法是什么?,mysql,performance,load-data-infile,insert,Mysql,Performance,Load Data Infile,Insert,我用C编写了一个程序来解析大型XML文件,然后用insert语句创建文件。其他一些进程会将文件摄取到MySQL数据库中。 这些数据将用作索引服务,以便用户可以轻松查找文档 我选择InnoDB是因为它具有行级锁定的能力。C程序将在给定的调用上生成500到500万条insert语句 将所有这些数据尽快输入数据库的最佳方法是什么?另一件需要注意的事情是,数据库位于单独的服务器上。是否值得将文件移动到该服务器以加快插入速度 编辑:此表不会真正更新,但将删除行 我至少会按照以下方式做这些事情: 将文件移到

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

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

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


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

我至少会按照以下方式做这些事情:

  • 将文件移到那里并通过unix套接字连接
  • 生成文件,而不是插入
  • 在加载期间禁用索引
    • 使用mysqlimport工具或LOAD DATA INFILE命令
    • 暂时禁用数据完整性不需要的索引

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

    1。确保使用事务。 事务消除了

    插入,同步到磁盘

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

    2.确保使用连接压缩 原始文本+GZip压缩流~=在某些情况下可节省高达90%的带宽

    3.尽可能使用平行插入符号
    (要发送的文本越少,操作越短)

    如果不能像其他人建议的那样使用加载数据填充,请使用准备好的插入查询。

    实际上取决于引擎。如果您使用的是InnoDB,请务必使用事务(您无法避免它们,但如果您使用autocommit,则每个批都隐式地包含在自己的txn中),但请确保它们既不太大也不太小

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

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


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

    如果它是一个只写的表,并且他可以被要求使用std MySQL格式,这就是所有开销。特别是你不需要的事务开销。你真的认为这比加载数据快吗?呵呵,也许不是,但是如果加载数据不是一个选项,其余的都是有意义的。
    INSERT INTO TableName(Col1,Col2) VALUES (1,1),(1,2),(1,3)