首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL批量插入优化:单条SQL插入多行数据语法与性能对比

     編輯:MySQL 綜合教學

标准批量插入语法

INSERT INTO Authors (AuthID, AuthFN, AuthMN, AuthLN) VALUES
(1006, 'H', 'S.', 'T'),
(1007, 'J', 'C', 'O'),
(1008, 'B', NULL, 'E'),
(1009, 'R', 'M', 'R'),
(1010, 'J', 'K', 'T'),
(1011, 'J', 'G.', 'N'),
(1012, 'A', NULL, 'P'),
(1013, 'A', NULL, 'W'),
(1014, 'N', NULL, 'A');

建表示例

CREATE TABLE Authors (
    AuthID SMALLINT NOT NULL PRIMARY KEY,
    AuthFN VARCHAR(20),
    AuthMN VARCHAR(20),
    AuthLN VARCHAR(20)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

执行结果验证

mysql> SELECT * FROM Authors;
+--------+--------+--------+--------+
| AuthID | AuthFN | AuthMN | AuthLN |
+--------+--------+--------+--------+
|   1006 | H      | S.     | T      |
|   1007 | J      | C      | O      |
|   1008 | B      | NULL   | E      |
|   1009 | R      | M      | R      |
|   1010 | J      | K      | T      |
|   1011 | J      | G.     | N      |
|   1012 | A      | NULL   | P      |
|   1013 | A      | NULL   | W      |
|   1014 | N      | NULL   | A      |
+--------+--------+--------+--------+
9 rows in set (0.00 sec)

性能优势分析

方式网络交互解析次数事务开销适用场景
循环单条INSERTN次N次N次(自动提交)极少数据、逻辑复杂
批量VALUES1次1次1次千~万行,推荐
LOAD DATA INFILE1次极少可控百万+行,最快
PreparedStatement批处理1次1次预编译1次应用层动态参数

最佳实践建议

  1. 分批提交:每批 500-2000 行,避免单条SQL过大超出 max_allowed_packet(默认4MB/64MB)
  2. 显式事务:START TRANSACTION; ...批量INSERT... COMMIT;
  3. 主键顺序:按主键顺序插入,减少InnoDB页分裂
  4. 禁用二级索引:大批量导入前 DROP INDEX,导入后 CREATE INDEX
  5. 调整参数:innodb_buffer_pool_size、innodb_log_file_size、innodb_flush_log_at_trx_commit=2(导入期间)

Java/JDBC 批处理示例

String sql = "INSERT INTO Authors (AuthID, AuthFN, AuthMN, AuthLN) VALUES (?, ?, ?, ?)";
try (Connection conn = getConnection();
     PreparedStatement ps = conn.prepareStatement(sql)) {
    
    conn.setAutoCommit(false);
    for (int i = 0; i < dataList.size(); i++) {
        Author a = dataList.get(i);
        ps.setInt(1, a.getId());
        ps.setString(2, a.getFn());
        ps.setString(3, a.getMn());
        ps.setString(4, a.getLn());
        ps.addBatch();
        
        if (i % 1000 == 0) {
            ps.executeBatch();
            conn.commit();
        }
    }
    ps.executeBatch();
    conn.commit();
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved