视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
MySQL数据库inset性能优化_MySQL
2020-11-09 20:13:33 责编:小采
文档
 我们在使用中MySQL的时候难免会遇到大批量数据inset的情况,通常最简单的方法就是写一个insert,然后通过循环给变量赋值,批量插入数据库:

 //save rddform
 for (int i = 0; i < rddformlist.Count; i++)
 {
 string cmdText = "insert into rddform 
 (ID,CreatedTime,ModifiedTime,CreatedBy,ModifiedBy,FormType) values 
 ('" + rddformlist[i].RddFormGuid + "','" + rddformlist[i].CreateTime + "','"
 + rddformlist[i].ModifyTime + "','" + rddformlist[i].CreateBy + "','" 
 + rddformlist[i].ModifyBy + "'," + rddformlist[i].FormType + ")";
 MySqlCommand mysqlcom = new MySqlCommand(cmdText, mysqlcon);
 mysqlcom.Transaction = trans; //绑定事务 
 mysqlcom.ExecuteNonQuery();
 }

经过方法经过亲测,性能不太好,本地大概是一秒insert20条数据,云上大概是一秒insert3条数据。两千条数据本地大概就要一分半,云上大概十几分,显然速度太慢了。

现在我们改为多条数据合并插入,就是用一个insert语句插入所有的数据:

//save rddform
 for (int i = 0; i < rddformlist.Count; i++)
 {
 strRddForm.Append("('" + rddformlist[i].RddFormGuid + "','" 
 + rddformlist[i].CreateTime + "','" + rddformlist[i].ModifyTime 
 + "','" + rddformlist[i].CreateBy + "','" + rddformlist[i].ModifyBy 
 + "','" + rddformlist[i].FormType + "')");
 if (i<rddformlist.Count-1)
 {
 strRddForm.Append(",");
 }
 }
 MySqlCommand rddformcom = new MySqlCommand(strRddForm.ToString(), mysqlcon);
 rddformcom.Transaction = trans; //绑定事务 
 rddformcom.ExecuteNonQuery();

亲测之后两千条本地真的是秒插,云上大概一秒多,这速度让人根本没有拒绝的理由,果断的把代码改了。当然速度可能根据个人机器以及网络环境因素有关,下面是网上牛人做的性能对比

注意事项:
SQL语句是有长度,在进行数据合并在同一SQL中务必不能超过SQL长度,通过max_allowed_packet配置可以修改,默认是1M,测试时修改为8M。
事务需要控制大小,事务太大可能会影响执行的效率。MySQL有innodb_log_buffer_size配置项,超过这个值会把innodb的数据刷到磁盘中,这时,效率会有所下降。所以比 较好的做法是,在数据达到这个这个值前进行事务提交。

下载本文
显示全文
专题