关于mysql 8.x 中insert ignore的性能问题

 更新时间:2022年08月25日 10:49:00   作者:真步  
这篇文章主要介绍了关于mysql 8.x 中insert ignore的性能问题,具有很好的参考价值,希望对大家有所帮助。

mysql 8.x中insert ignore性能问题

mysql中replace into效率很差,多进程并发一下就会锁表,所以应该用on duplicate 来做更新,这是众所周知的了。没想到insert ignore也有性能坑,记录下遇到的问题。

为了往一张表中插入初始化数据,我开了10个进程并发向数据库中使用insert ignore插入数据,每条insert ignore语句包含7行数据。没想到上线开始跑脚本以后数据库出现不少锁表。根据innodb status log来看,锁住的是表的自增id主键。

调试了半天之后发现,原来是insert ignore的时候会对插入的每一行数据取S锁做unique id的检测,同时会对主键的自增id字段加写意向锁(insert intension),在unique key较为复杂的时候,检测unique key的时候会一直占用主键的插入意向锁,其他insert ignore也想给主键id加插入意向锁,导致死锁。

以上情况是在mysql 8.x中发现的,以前用低版本的mysql似乎没遇到过相关问题,所以不清楚低版本mysql的insert ignore是否有坑,但是8.x的版本最好insert ignore不要插入多行数据,尤其是unique key比较复杂的时候(有三四个字段共同组成)

mysql insert ignore()函数

INSERT IGNORE语句

当您使用该INSERT语句向一个表中添加多行时,如果在处理过程中发生错误,则MySQL终止该语句并返回错误。结果,没有行插入到表中。

但是,如果使用该insert ignore语句,则会忽略包含导致错误的无效数据的行,并将具有有效数据的行插入表中。

insert ignore into actor values (3,'ED','CHASE','2006-02-15 12:34:33')

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

相关文章

  • Mysql Online DDL的使用详解

    Mysql Online DDL的使用详解

    在日常DBA运维过程中,对表结构进行变更算是个普遍的需求了。如果操作的对象是个热表、大表,难免心里一怵,这些DDL操作是否可以直接执行,哪些会影响线上读写,哪些会影响主从,甚至导致服务器压力骤升,本文做了梳理,希望对大家有所帮助。
    2021-05-05
  • Centos7 移动mysql5.7.19 数据存储位置的操作方法

    Centos7 移动mysql5.7.19 数据存储位置的操作方法

    这篇文章主要介绍了Centos7 移动mysql5.7.19 数据存储位置的实现方法,需要的朋友可以参考下
    2017-10-10
  • MySQL数据库查询之多表查询总结

    MySQL数据库查询之多表查询总结

    最近遇到了多表查询的需求,也称为关联查询,指两个或更多个表一起完成查询操作,下面这篇文章主要给大家介绍了关于MySQL数据库查询之多表查询的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • MySQL授权用户访问数据操作方式

    MySQL授权用户访问数据操作方式

    用户授权操作可以控制数据库用户对数据库对象的访问权限,本文就来介绍MySQL授权用户访问数据操作方式,感兴趣的可以了解一下
    2023-10-10
  • Mysql 忘记root密码的完美解决方法

    Mysql 忘记root密码的完美解决方法

    通常在使用Mysql数据库时,如果长时间没有登陆,或者由于工作交接完成度不高,会导致数据库root登陆密码忘记,本文给大家介绍一种当忘记mysql root密码时的解决办法,一起看看吧
    2016-12-12
  • Mysql实现模糊查询的两种方式(like子句 、正则表达式)

    Mysql实现模糊查询的两种方式(like子句 、正则表达式)

    通配符是一种特殊语句,主要用来模糊查询,下面这篇文章主要给大家介绍了关于给Mysql实现模糊查询的两种方式,分别是like子句 、正则表达式,需要的朋友可以参考下
    2022-09-09
  • Mysql中group by 使用中发现的问题

    Mysql中group by 使用中发现的问题

    当使用MySQL的GROUP BY语句时,根据指定的列对结果进行分组,这种情况通常是由于在 GROUP BY 中选择的字段与其他非聚合字段不兼容,或者在 SELECT 子句中没有正确使用聚合函数所导致的,本文给大家介绍Mysql中group by 使用中发现的问题,感兴趣的朋友跟随小编一起看看吧
    2024-06-06
  • mysqldump备份数据库时排除某些库的实例

    mysqldump备份数据库时排除某些库的实例

    下面小编就为大家带来一篇mysqldump备份数据库时排除某些库的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • mysql主键的缺少导致备库hang住

    mysql主键的缺少导致备库hang住

    最近线上频繁的出现slave延时的情况,经排查发现为用户在删除数据的时候,由于表主键的主键的缺少,同时删除条件没有索引,或或者删除的条件过滤性极差,导致slave出现hang住
    2016-05-05
  • Mysql提升索引效率优化的八种方法总结

    Mysql提升索引效率优化的八种方法总结

    索引实际上也是一张表,保存了主键和索引的字段,并且指向实体表的记录,所以索引也是需要占用空间的,这篇文章主要给大家介绍了关于Mysql提升索引效率优化的八种方法,需要的朋友可以参考下
    2024-04-04

最新评论