Mysql replace 与 insert on duplicate效率分析
导读
我们在向数据库里批量插入数据的时候,会遇到要将原有主键或者unique索引所在记录更新的情况,而如果没有主键或者unique索引冲突的时候,直接执行插入操作。
这种情况下,有三种方式执行:
直接
直接每条select, 判断, 然后insert,毫无疑问,这是最笨的方法了,不断的查询判断,有主键或索引冲突,执行update,否则执行insert. 数据量稍微大一点这种方式就不行了。
稍微高级一些的方式。
replace
这是mysql自身的一个语法,使用 replace
的时候。其语法为:
replace into tablename (f1, f2, f3) values(vf1, vf2, vf3),(vvf1, vvf2, vvf3)
这中语法会自动查询主键或索引冲突,如有冲突,他会先删除原有的数据记录,然后执行插入新的数据。
insert on duplicate key.
这也是一种方式,mysql的insert操作中也给了一种方式,语法如下:
INSERT INTO table (a,b,c) VALUES (1,2,3)ON DUPLICATE KEY UPDATE c=c+1;
在insert时判断是否已有主键或索引重复,如果有,一句update后面的表达式执行更新,否则,执行插入。
第一种方式不说了,replace和insert on duplicate key这两种方式,哪中效率更高一些呢,毕竟,我们的执行sql,追求的就是高效。
分析
在最终实践结果中,得到接过如下:
在数据库数据量很少的时候, 这两种方式都很快,无论是直接的插入还是有冲突时的更新,都不错,但在数据库表的内容数量比较大(如百万级)的时候,两种方式就不太一样了,
首先是直接的插入
操作,两种的插入效率都略低, 比如直接向表里插入1000条数据(百万级的表(innodb引擎)),二者都差不多需要5,6甚至十几秒。究其原因,我的主机性能是一方面,但在向大数据表批量插入数据的时候,每次的插入都要维护索引的, 索引固然可以提高查询的效率,但在更新表尤其是大表的时候,索引就成了一个不得不考虑的问题了。
其次是更新
表,这里的更新的时候是带主键值的(因为我是从另一个表获取数据再插入,要求主键不能变)
同样直接更新1000条数据, replace的操作要比insert on duplicate的操作低太多太多, 当insert瞬间完成(感觉)的时候,replace要7,8s, replace慢的原因我是知道的,在更新数据的时候,要先删除旧的,然后插入新的,在这个过程中,还要重新维护索引,所以速度慢,但为何insert on duplicate的更新却那么快呢。 在向老大请教后,终于知道,insert on duplicate 的更新操作虽然也会更新数据,但其对主键的索引却不会有改变,也就是说,insert on duplicate 更新对主键索引没有影响.因此对索引的维护成本就低了一些(如果更新的字段不包括主键,那就要另说了
)。
题外话:
在向数据量大的表里批量插入更新数据的时候,随着插入的数量越来越多,会导致越来越慢,这种情况下,因为我们用的innodb表,可以开启事务, 每次批量执行一批数据更新后提交, 再重新开事务处理下批数据,这样会有效增加效率
还有说明一下: 当我们执行数据库的插入和更新操作很慢的时候,不仅仅是语句,主机性能也很重要, 比如内存和cpu, 如果是虚拟机要相应适当调整, 如果在各种优化了之后效率还是很低, 但cpu和内存的占用却不高,那么就很可能是磁盘的IO性能了,这也会导致数据的更新速度慢。
PS: 数据库菜鸟一个, 所知有限, 如有纰漏, 还请指教
Mysql replace 与 insert on duplicate效率分析相关推荐
- Mysql之浅析INSERT ON DUPLICATE
前言 如果不特别指出,默认mysql版本为8.0 简介 往数据库中插入记录时,如果发生唯一索引值冲突,insert on duplicate允许进行进一步的crud操作.伪代码如下: insert r ...
- insert 语句_替换某字段中的特定字符串——MySQL REPLACE 与INSERT 函数详解
MySQL提供了一个非常实用的字符串函数--REPLACE() 函数,它允许用新的字符串替换字段中的特定字符串,而不再需要自己写函数去替换,用起来非常的方便. REPLACE() 函数语法 需要注意的 ...
- “ INSERT IGNORE”与“ INSERT…ON DUPLICATE KEY UPDATE”
在执行包含多行的INSERT语句时,我想跳过重复的条目,否则它们会导致失败. 经过研究后,我的选择似乎是使用以下任一方法: ON DUPLICATE KEY UPDATE ,这意味着要付出一定的代价进 ...
- mysql Insert on duplicate引发的死锁
表 CREATE TABLE `test_dup` ( `id` int(11) NOT NULL AUTO_INCREMENT, `num` int(10) unsigned DEFAULT NUL ...
- MySQL replace into 的坑以及insert相关操作
下面我们主要说一下在插入时候的几种情况: 1:insert ignore 2:replace into 3:ON DUPLICATE KEY UPDATE 关于insert ignore: 关于rep ...
- mysql replace into 语法_mysql Replace into与Insert update
Replace into replace into 跟 insert 功能类似, 不同点在于:replace into 首先尝试插入数据到表中, 1. 如果发现表中已经有此行数据(根据主键或者唯一索引 ...
- MySQL replace into (insert into 的增强版)
在使用SQL语句进行数据表插入insert操作时,如果表中定义了主键,插入具有相同主键的记录会报错: Error Code: 1062. Duplicate entry 'XXXXX' for ke ...
- MySQL · 案例分析 · RDS MySQL线上实例insert慢常见原因分析
概述 insert慢是经常被问到的问题,笔者尝试在本文中对这个问题做一个分类梳理,列举的线上例子会做简化,希望对读者有所启发. 注意:因为阿里云MySQL线上实例还是以RDS 5.6为主体,本文的分析 ...
- 线上阿里云mysql慢_MySQL · 案例分析 · RDS MySQL线上实例insert慢常见原因分析-阿里云开发者社区...
概述 insert慢是经常被问到的问题,笔者尝试在本文中对这个问题做一个分类梳理,列举的线上例子会做简化,希望对读者有所启发. 注意:因为阿里云MySQL线上实例还是以RDS 5.6为主体,本文的分析 ...
- mysql replace 效率,MySQL replace实用场景 MySQL实现replace函数的几种实用场景
想了解MySQL实现replace函数的几种实用场景的相关内容吗,_陈哈哈在本文为您仔细讲解MySQL replace实用场景的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:MySQL,r ...
最新文章
- 谷歌、阿里们的杀手锏:3大领域,10大深度学习CTR模型演化图谱(附论文)
- Java I/O不迷茫,一文为你导航!
- 外地买房,提取公积金
- Mocha BSM产品亮点——事件管理
- 深度学习中交叉熵_深度计算机视觉,用于检测高熵合金中的钽和铌碎片
- java 获取手机归属地_java 获取手机归属地
- mysql 查看集群状态_MySQL数据库集群正确配置步骤
- mwt是什么意思网络用语_网络用语奶茶婊是什么意思(奶茶婊具备的3个表现)...
- [2018.10.25 T3] 旅程
- Spring常用注解详解大全(建议收藏)
- java图片处理,文字自动换行
- matlab解薛定谔方程,定态薛定谔方程的MATLAB求解(一)
- RGB颜色过度,数值转颜色
- html如何设置table的宽度,HTML怎么设置table宽度
- 上java培训班有用吗?Java有必要上培训班吗?
- linux安装glib,glib源码安装使用方法
- 地理科学与计算机技术的关系,地理信息系统与地理学的关系
- eeglab脑电数据预处理:step by step
- StatsD与Graphite联合作战
- 百度SRE工程师提前批一面总结+为二面攒人品