Mysql-Insert插入过慢的原因记录和解决方案

 更新时间:2023年08月30日 15:34:11   作者:胡安民  
这篇文章主要介绍了Mysql-Insert插入过慢的原因记录和解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Mysql Insert插入过慢的原因

场景

先来说下业务场景, A单位每天下发全量数据5万数据左右,我们需要将这5万条数据处理到主表中以及日志表中

我们现在的逻辑是,先将数据每次100条批量修改或者插入到主表中, 然后我们通过事件监听将每次插入或者修改的动作都记录到日志表中

问题: 因为我们插入日志表的时候是每次处理一条这样就导致了5万条日志数据,一个一个插入非常耗时,抱着能提升一点就提升一点的想法,我们看看插入还能优化吗?

先来说一下: Mysql中单条语句原子性的,所以高并发情况下不会有安全性问题

说说插入会慢的影响因素

  • Mysql插入缓存(bulk_insert_buffer_size 默认是8M)
  • 每条数据在插入的时候都要验证是否违反表中的约束条件(主键,唯一等)
  • 构建新数据的索引
  • innodb中,数据通常都是先写缓存,再写事务日志,再写入数据文件
  • Mysql 每秒最大支持16384并发 ,但是默认只有151可以设置max_connections数量
  • 服务器性能,cpu,硬盘,网络, 网络数据传输 ,代码解析
  • 数据库事务影响

解决办法

先设置mysql的插入缓存bulk_insert_buffer_size=100M,确保一次能插入1000条数据

然后使用List方式记录需要插入的数据当达到1000条之后我们批量一次性插入

insert into tablename values('xxx','xxx'),('yyy','yyy'),('zzz','zzz')...... 

然后在清空List ,插入的过程中我们可以异步,不用等待结果的返回 ,通过上面的方案, 插入100万数据几十秒就完事了

为什么要这样解决呢?

因为批量插入其实就是访问一次数据量告诉数据库我需要执行这1000条的插入,而不是访问1000次数据库告诉数据库我要执行1条的插入所以使用批量插入大大的缩减客户端与数据库之间的连接、关闭等消耗 , 所以我们在上面的方案中使用一次提交批量数据的更新的语句,那么还有没其他的方式呢?

MySQL 的事务自动提交模式默认是开启的,其对 MySQL 的性能也有一定得影响。

也就是说如果你执行1000 条插入语句,MySQL 就会提交 1000 次事物,这大大影响了插入数据的速度。

我们还可以在代码中,手动开启事物也就是相当于希望事物内执行的语句要作为一个“不可分割”的整体去执行的任务当所有任务完毕后在提交事物,当然这样是没有批量插入快的但是也能节约不少时间的

MySQL数据库Insert语句慢SQL处理

问题描述

insert into …普通的插入语句,经常出现耗时2s以上

数据状态

1.表数据量大,每天产生200万条数据

2.高并发插入

问题解决

1.由于表中数据量庞大,建议数据归档处理,冷热处理

2.表中有过多索引,当数据insert时,索引会重排产生太多的io操作。导致缓慢,有必然要的只保留主键。

3.表的数据库引擎,默认InnerDB,若数据不重要,可以使用MyISAM

4.注意字段text使用,内存过大会引起表膨胀,影响插入和查询效率

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • mysql 5.7.17 免安装版配置方法图文教程(windows10)

    mysql 5.7.17 免安装版配置方法图文教程(windows10)

    这篇文章主要为大家详细介绍了windows10下mysql 5.7.17 免安装版配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • mysql 表维护与改造代码分享

    mysql 表维护与改造代码分享

    当数据库中表的数量比较多时,不利于维护,本文将以此问题进行详细介绍如何维护mysql表,与如何修改mysql表
    2012-11-11
  • Mysql用户权限分配实战项目详解

    Mysql用户权限分配实战项目详解

    用户是数据库的使用者和管理者,MySQL通过用户的设置来控制数据库操作人员的访问与操作范围,这篇文章主要给大家介绍了关于Mysql用户权限分配实战项目的相关资料,需要的朋友可以参考下
    2023-12-12
  • Mysql创建表以及数据库crud语句举例详细讲解

    Mysql创建表以及数据库crud语句举例详细讲解

    MySQL作为关系型数据库管理系统,提供了丰富的数据操作功能,其中CRUD(创建、读取、更新、删除)是基本的操作方式,这篇文章主要介绍了Mysql创建表以及数据库crud语句的相关资料,需要的朋友可以参考下
    2025-08-08
  • docker安装MySQL报错端口被占用问题解决办法

    docker安装MySQL报错端口被占用问题解决办法

    docker部署mysql容器时,最常见的启动失败原因之一是宿主机的3306端口被占用,这篇文章主要介绍了docker安装MySQL报错端口被占用问题解决办法的相关资料,文中将解决的办法介绍的非常详细,需要的朋友可以参考下
    2026-03-03
  • MySQL 分表优化试验代码

    MySQL 分表优化试验代码

    我们的项目中有好多不等于的情况。今天写这篇文章简单的分析一下怎么个优化法。
    2010-04-04
  • 一文详解如何在Mycat中配置多个Schema

    一文详解如何在Mycat中配置多个Schema

    在分布式数据库架构中,Mycat 作为一个中间件,提供了强大的数据分片和路由能力,本文将详细介绍如何在 Mycat 中配置多个 Schema,以满足不同业务模块的数据隔离需求,希望对大家有所帮助
    2025-05-05
  • 揭开SQL中NULL的神秘面纱

    揭开SQL中NULL的神秘面纱

    表的字段默认允许存放NULL值,这意味着,您在插入记录或者更新记录时,可以不为该字段指定值,此时该字段将存储NULL值,这篇文章将揭开SQL中NULL的神秘面纱。这个问题可能困扰着很多初级开发者
    2023-01-01
  • MySQL数据库对敏感数据加密及解密的实现方式

    MySQL数据库对敏感数据加密及解密的实现方式

    这篇文章主要介绍了MySQL数据库对敏感数据加密及解密的实现方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2020-03-03
  • mysql如何将查询结果插入到另一张表中

    mysql如何将查询结果插入到另一张表中

    这篇文章主要介绍了mysql如何将查询结果插入到另一张表中问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10

最新评论