【问题标题】:What is the best way to achieve speedy inserts of large amounts of data in MySQL?在 MySQL 中实现快速插入大量数据的最佳方法是什么?
【发布时间】:2010-09-23 19:07:12
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: mysql performance load-data-infile insert


    【解决方案1】:
    • 使用 mysqlimport 工具或 LOAD DATA INFILE 命令。
    • 暂时禁用不需要数据完整性的索引

    【讨论】:

      【解决方案2】:

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

      1. 将文件移到那里并通过 unix 套接字连接
      2. 生成 LOAD DATA INFILE 文件,而不是 INSERTS
      3. 在加载过程中禁用索引

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          1。确保您使用交易。

          事务消除

          插入,同步到磁盘

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

          2。确保使用连接压缩

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

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

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

          (发送的文本更少,操作更短)

          【讨论】:

          • 如果是只写表,可以劝他使用std MySQL格式,那都是开销。尤其是您不需要的事务的开销。
          • 你真的认为这比 LOAD DATA 快吗?
          • 嘿,可能不是,但如果 LOAD DATA 不是一个选项,那么其余的都是有意义的。
          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

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

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

            无论哪种方式,LOAD DATA 都是赢家。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-03-07
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多