关于mysql 8.x 中insert ignore的性能问题
目录
- mysql 8.x中insert ignore性能问题
- mysql insert ignore()函数
- 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通过INSERT IGNORE INTO插入拼音字符无效问题及解决
目录 前言 一.准备工作 二.场景复现 三.解决问题 总结 前言 在做一个批量导入关键词的功能时,发现关键词如果带有像é这样的拼音字符时,存入数据库时会识别为e,造成部分关键词没有被导入,且与原来部分关键词可能重复的情况,因此记录下来避免以后再踩坑. 提示:以下是本篇文章正文内容,下面案例可供参考 一.准备工作 准备一份批量导入关键词excel,其中包含2个关键词 1.pokemon 2.pokémon 注意:这2个关键词中一个是普通的e,一个是带音节的é 准备数据库表sql脚本 -- 导入关键
-
MySQL中的insert ignore into使用
目录 MySQL中的insert ignore into 1.插入的数据是主键冲突时 2.没有主键冲突时,直接插入数据 insert ignore into--跳坑 MySQL中的insert ignore into 最近工作中,使用到了insert ignore into语法,感觉这个语法还是挺有用的,就记录下来做个总结. insert ignore into : 忽略重复的记录,直接插入数据. 包括两种场景: 1.插入的数据是主键冲突时 insert ignore into会给出warnin
-
mysql insert的几点操作(DELAYED,IGNORE,ON DUPLICATE KEY UPDATE )
INSERT语法 INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [(col_name,...)] VALUES ({expr | DEFAULT},...),(...),... [ ON DUPLICATE KEY UPDATE col_name=expr, ... ] 或: INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INT
-
关于mysql 8.x 中insert ignore的性能问题
目录 mysql 8.x中insert ignore性能问题 mysql insert ignore()函数 INSERT IGNORE语句 mysql 8.x中insert ignore性能问题 mysql中replace into效率很差,多进程并发一下就会锁表,所以应该用on duplicate 来做更新,这是众所周知的了.没想到insert ignore也有性能坑,记录下遇到的问题. 为了往一张表中插入初始化数据,我开了10个进程并发向数据库中使用insert ignore插入数据,每条
-
mysql中insert ignore、insert和replace的区别及说明
目录 insert ignore.insert和replace的区别 测试代码 insert replace insert ignore insert ignore.insert和replace的区别 指令 已存在 不存在 举例 insert 报错 插入 insert into names(name, age) values(“小明”, 23); insert ignore 忽略 插入 insert ignore into names(name, age) values(“小明”, 24); r
-
解析MySQL中INSERT INTO SELECT的使用
1. 语法介绍有三张表a.b.c,现在需要从表b和表c中分别查几个字段的值插入到表a中对应的字段.对于这种情况,可以使用如下的语句来实现:INSERT INTO db1_name (field1,field2) SELECT field1,field2 FROM db2_name 上面的语句比较适合两个表的数据互插,如果多个表就不适应了.对于多个表,可以先将需要查询的字段JOIN起来,然后组成一个视图后再SELECT FROM就可以了: INSERT INTO a (field1,field2)
-
mysql中insert与select的嵌套使用方法
本文讲述了mysql中insert与select的嵌套使用的方法,对于初学MySQL的朋友有一定的借鉴价值. 这里需要实现在mysql从多个表中组合字段然后插入到一个新表中,通过一条sql语句实现该功能需求.具体情形是:有三张表a.b.c,现在需要从表b和表c中分别查几个字段的值插入到表a中对应的字段.对于这种情况,我们可以使用如下的语句来实现: INSERT INTO db1_name(field1,field2) SELECT field1,field2 FROM db2_name 当然,上
-
MySQL中insert语句的使用与优化教程
MySQL 表中使用 INSERT INTO SQL语句来插入数据. 你可以通过 mysql> 命令提示窗口中向数据表中插入数据,或者通过PHP脚本来插入数据. 语法 以下为向MySQL数据表插入数据通用的 INSERT INTO SQL语法: INSERT INTO table_name ( field1, field2,...fieldN ) VALUES ( value1, value2,...valueN ); 如果数据是字符型,必须使用单引号或者双引号,如:"value"
-
MySQL 5.7中的关键字与保留字详解
前言 MySQL和Oracle的关键字还是不尽相同的,在Oracle数据库中,我们的数据表中定义了大量的code字段用来表示主键,但是在MySQL中code是关键字,使用以前的处理方法就有些"水土不服". 下面我们来了解一下MySQL中的关键字和保留字. 什么是关键字和保留字 关键字是指在SQL中有意义的字. 某些关键字(例如SELECT,DELETE或BIGINT)是保留的,需要特殊处理才能用作表和列名称等标识符. 这一点对于内置函数的名称也适用. 如何使用关键字和保留字 非保留关键
-
Mysql 原生语句中save or update 的写法汇总
背景 在平常的开发中,经常碰到这种更新数据的场景:先判断某一数据在库表中是否存在,存在则update,不存在则insert. 如果使用Hibernate,它自带saverOrUpdate方法,用起来很方便,但如使用原生sql语句呢? 新手最常见的写法是,先通过select语句查询记录是否存在,存在则使用update语句更新,不存在则使用insert语句插入. 但是这样做明显不够优雅,存在几个问题: •为了执行一次更新操作,却在程序中使用了两次sql查询语句,在系统负载比较大的情况下,性能
-
MyBatis中insert操作返回主键的实现方法
在使用MyBatis做持久层时,insert语句默认是不返回记录的主键值,而是返回插入的记录条数:如果业务层需要得到记录的主键时,可以通过配置的方式来完成这个功能 针对Sequence主键而言,在执行insert sql前必须指定一个主键值给要插入的记录,如Oracle.DB2,可以采用如下配置方式: <insert id="add" parameterType="vo.Category"> <selectKey resultType="
随机推荐
- AngularJS基于provider实现全局变量的读取和赋值方法
- prototype1.4中文手册
- springMVC结合AjaxForm上传文件
- Java输入三个整数并把他们由小到大输出(x,y,z)
- java调用未知类的指定方法简单实例
- linux自动运行rman增量备份脚本
- OpenStack Keystone的基本概念详细介绍
- js实现的二级横向菜单条实例
- Zend Framework入门教程之Zend_Db数据库操作详解
- python合并文本文件示例
- VBS、ASP代码语法加亮显示的类
- css expression 隔行换色
- JavaScript编写页面半透明遮罩效果的简单示例
- Spring spel表达式使用方法示例
- java获取当前日期使用实例
- 解析Android开发优化之:从代码角度进行优化的技巧
- 使用路由的方法过滤特定MAC的主机
- Centos7 利用LVM实现动态扩容的方法
- 使用APScheduler3.0.1 实现定时任务的方法
- 百度人脸识别之人脸识别FaceIdentify(签到考勤)