vue.js做网站,金华网站建设网站,怀化网站seo,如保做网站赢利Mysql 插入大批量数据调优方法[toc]1、多线程插入#xff08;单表#xff09;在数据里做插入操作的时候#xff0c;整体时间的分配是这样的#xff1a;链接耗时 #xff08;30%#xff09;发送query到服务器 #xff08;20%#xff09;解析query #xff08;20%#…Mysql 插入大批量数据调优方法[toc]1、多线程插入单表在数据里做插入操作的时候整体时间的分配是这样的链接耗时 30%发送query到服务器 20%解析query 20%插入操作 10% * 词条数目插入index 10% * Index的数目关闭链接 10%从这里可以看出来真正耗时的不是操作而是链接解析的过程。MySQL插入数据在写阶段是独占的但是插入一条数据仍然需要解析、计算、最后才进行写处理比如要给每一条记录分配自增id校验主键唯一键属性或者其他一些逻辑处理都是需要计算的所以说多线程能够提高效率。2、多线程插入多表分区分表后使用多线程插入。3、预处理 Sql普通SQL即使用Statement接口执行SQL预处理SQL即使用PreparedStatement接口执行SQL使用PreparedStatement接口允许数据库预编译SQL语句以后只需传入参数避免了数据库每次都编译SQL语句因此性能更好。String sql insert into testdb.tuser (name, remark, createtime, updatetime) values (?, ?, ?, ?);
for (int i 0; i m; i) {//从池中获取连接Connection conn myBroker.getConnection();PreparedStatement pstmt conn.prepareStatement(sql);for (int k 0; k n; k) {pstmt.setString(1, RandomToolkit.generateString(12));pstmt.setString(2, RandomToolkit.generateString(24));pstmt.setDate(3, new Date(System.currentTimeMillis()));pstmt.setDate(4, new Date(System.currentTimeMillis()));//加入批处理pstmt.addBatch();}pstmt.executeBatch(); //执行批处理pstmt.close();myBroker.freeConnection(conn); //连接归池
}3、多值插入SQL普通插入SQLINSERT INTO TBL_TEST (id) VALUES(1)多值插入SQLINSERT INTO TBL_TEST (id) VALUES (1), (2), (3)使用多值插入SQLSQL语句的总长度减少即减少了网络IO同时也降低了连接次数数据库一次SQL解析能够插入多条数据。4、事务(N条提交一次)在一个事务中提交大量INSERT语句可以提高性能。1、将表的存储引擎修改为myisam2、将 sql 拼接成字符串每 1000 条左右提交事务。/// summary
/// 执行多条SQL语句实现数据库事务。
/// /summarymysql数据库
/// param nameSQLStringList多条SQL语句/param
public void ExecuteSqlTran(Liststring SQLStringList) {using(MySqlConnection conn new MySqlConnection(connectionString)){if (DBVariable.flag) {conn.Open();MySqlCommand cmd new MySqlCommand();cmd.Connection conn;MySqlTransaction tx conn.BeginTransaction();cmd.Transaction tx;try {for (int n 0; n SQLStringList.Count; n) {string strsql SQLStringList[n].ToString();if (strsql.Trim().Length 1) {cmd.CommandText strsql;cmd.ExecuteNonQuery();}//后来加上的if (n 0 (n % 1000 0 || n SQLStringList.Count - 1)) {tx.Commit();tx conn.BeginTransaction();}}//tx.Commit();//原来一次性提交} catch (System.Data.SqlClient.SqlException E) {tx.Rollback();throw new Exception(E.Message);}}}
}