MySQL INSERT INTO SELECT 与 BULK INSERT 性能

Clo*_*zon 6 mysql mariadb bulk-insert

目前,我正在尝试将数据从 复制TABLE1TABLE2

就插入性能而言,如果我这样做,它会相同还是更快

  • BULK INSERT手动(即通过 批量插入每 10K 条记录到 TABLE2 中INSERT INTO TABLE2 VALUES (1,2), (5,5), ...),与
  • INSERT INTO TABLE2 SELECT * FROM TABLE1

Rol*_*DBA 4

您必须使用 BULK INSERT。

为什么不INSERT INTO TABLE2 SELECT * FROM TABLE1???

运行INSERT INTO TABLE2 SELECT * FROM TABLE1需要单个事务。

想象一下执行单次回滚时撤消日志的填充情况。

如果该事务失败并回滚,则会创建大量表碎片。

为什么BULK INSERT要手动???

这减轻了 InnoDB 存储引擎保存大量撤消信息的压力。

示例:mysqldump

您是否注意到在重新加载 mysqldump 时,一次会插入数百或数千行?如果你像这样 grep mysqldump:

grep "^INSERT" dump.sql
Run Code Online (Sandbox Code Playgroud)

您将看到许多带有 INSERT 的行。默认情况下,每个 INSERT 都是一个扩展插入。这允许每个 INSERT 命令插入 100 行。因此,您已经建议的一次 BULK INSERT 10K 行的原则是完全可以接受的。

  • 如果我要使用执行 `INSERT INTO TABLE2 SELECT * FROM TABLE1 WHERE id >= X and id < Y` 的脚本(其中 X 和 将在每个周期/事务后增加 10K)会怎么样?这实际上与执行 BULK INSERT 10K 记录相同吗(又名“INSERT INTO TABLE2 VALUES (?,?),(?,?)..`)? (2认同)