首页 > 数据库 >【mysql】类似replace 存在更新,否则插入的几种方式

【mysql】类似replace 存在更新,否则插入的几种方式

时间:2023-05-11 11:56:15浏览次数:47  
标签:insert 索引 更新 replace 插入 mysql 主键

我们在向数据库里插入数据的时候,会遇到要将原有主键或者unique索引所在记录更新的情况,而如果没有主键或者unique索引冲突的时候,直接执行插入操作。

这种情况下,有三种方式执行:

1.直接

直接每条select, 判断, 然后insert,毫无疑问,这是最笨的方法了,不断的查询判断,有主键或索引冲突,执行update,否则执行insert. 数据量稍微大一点这种方式就不行了。

稍微高级一些的方式。

2.replace into

这是mysql自身的一个语法,使用replace的时候。其语法为:

replace into tablename (f1, f2, f3) values(vf1, vf2, vf3),(vvf1, vvf2, vvf3)

这中语法会自动查询主键或索引冲突,如有冲突,他会先删除原有的数据记录,然后执行插入新的数据。

3.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,追求的就是高效。

4.insert ignore into

当使用 insert ignore 写入数据时,如果出现错误,如重复数据,将不返回错误,仅以警告形式返回。也就是 insert ignore 会忽略数据库中已经存在的数据,如果写入新数据后不会导致重复,那么写入新的数据,如果写入新数据后会导致重复,那么就跳过这行新数据

5.insert … select … where not exist ……

除此之外,在 MySQL数据库中,写入一条数据,我们可以先检查这条数据是否已经存在,当数据不存在时再执行写入操作,这样可以不只通过主键索引(PRIMARY KEY)或者唯一索引(UNIQUE KEY)来判断,也可通过其它条件

 

 

分析replace into 和  insert on duplicate key的效率

在最终实践结果中,得到结果如下:
在数据库数据量很少的时候, 这两种方式都很快,无论是直接的插入还是有冲突时的更新,都不错,但在数据库表的内容数量比较大(如百万级)的时候,两种方式就不太一样了,

首先是直接的插入操作,两种的插入效率都略低, 比如直接向表里插入1000条数据(百万级的表(innodb引擎)),二者都差不多需要5,6甚至十几秒。究其原因,我的主机性能是一方面,但在向大数据表批量插入数据的时候,每次的插入都要维护索引的, 索引固然可以提高查询的效率,但在更新表尤其是大表的时候,索引就成了一个不得不考虑的问题了。

其次是更新表,这里的更新的时候是带主键值的(因为我是从另一个表获取数据再插入,要求主键不能变) 同样直接更新1000条数据, replace的操作要比insert on duplicate的操作低太多太多, 当insert瞬间完成(感觉)的时候,replace要7,8s, replace慢的原因我是知道的,在更新数据的时候,要先删除旧的,然后插入新的,在这个过程中,还要重新维护索引,所以速度慢,但为何insert on duplicate的更新却那么快呢。 在向老大请教后,终于知道,insert on duplicate 的更新操作虽然也会更新数据,但其对主键的索引却不会有改变,也就是说,insert on duplicate 更新对主键索引没有影响.因此对索引的维护成本就低了一些

 

 

标签:insert,索引,更新,replace,插入,mysql,主键
From: https://www.cnblogs.com/zzsuje/p/17390634.html

相关文章

  • 使用Mysql访问数据
    首先前段配置好git然后在网址输入spring.io找到学习,指南选项 打开AccessingdatawithMySQL 在选项中进行git克隆,等待完成后在idea中打开complete文件夹 如果不更改镜像源会无法同步成功,构建需要进行镜像源修改......
  • 利用 systemd 管理 MySQL 单机多实例
    利用systemd管理MySQL单机多实例1修改配置文件[root@localhost/root]#cat/etc/my.cnf[mysql]#prompt="\u@mysqldb\R:\m:\s[\d]>"prompt="[\\u@\\h@\\p][\\d]>\\_"no_auto_rehashloose-skip-binary-as-hex[mysqld]basedir=......
  • location.href和location.replace的区别
    情景比如支付过程中或者使用商品的优惠券,而使用这张优惠券需要取请求一个第三方的地址,中间会有一次跳转。若使用window.location.href=“url”,按流程操作是没问题的,但是如果用户点击返回,则无法跳回原本的提交订单的页面,会一直进行重复请求,造成程序出错。所以,必须替换成wind......
  • mac 安装mysql
    一:下载最新的MySQL社区版为了安装更方便,建议下载dmg安装包。通用版本是5.7.20。二:安装MySQL双击mysql-5.7.20-macos10.12-x86_64.dmg文件,加载镜像双击mysql-5.7.20-macos10.12-x86_64.pkg,开始安装一直点击继续就可以安装成功。注意:安装完成之后会弹出一个对话框,告诉......
  • MySQL创建经典教师学生表并插入测试数据
    一、表字段学生表Student(s_id,s_name,s_birth,s_sex):学生编号、姓名、年月、性别课程表Course(c_id,c_name,t_id):课程编号、课程名称、教师编号教师表Teacher(t_id,t_name):教师编号、教师姓名成绩表Score(s_id,c_id,s_score):学生编号、课程编号、分数二、创建表1......
  • Windows的Mysql5.7社区版的安装详细操作,从无到有,安装配置一条龙服务。(压缩包自行安装,
    换了一个电脑,所有软件、环境都得重新来安装一次,安装到Mysql的时候,发现网上有两种安装方式,一种是Mysql的压缩包安装方式,这种方式直接到官网下载Mysql的压缩包,解压之后做些配置就可以了,另一种是Mysql的Installer一站式的安装,这种方法步骤相对来说少点,但是要先安装个Installer在......
  • mysql的MVCC
    Mysql的大多数事务型存储引擎实现的都不是简单的行级锁。基于提升并发性能的考虑,他们一般都同时实现了MVCC.实现了非阻塞的读操作,写操作也只锁定必要的行。MVCC的实现,是通过保存数据在某个时间点的快照来实现的。即为:不管需要执行多长时间,每个事务看到的数据都是一致的。不同的......
  • mysql 大表删除表数据
    创建硬链接,指向ibd文件lno_cust_from_spe_034.ibdo_cust_from_spe_034.ibd_2droptabledroptableo_cust_from_spe_034;使用linux的truncate命令逐步删除文件,释放空间seq2194-1010表示:从2194G开始,每次递减10,直到循环至10foriinseq58-1010;dosleep1......
  • 如何优化一条MySQL查询
    概览1、合理建立索引。在合适的字段上建立索引,例如在where和orderby命令上涉及的列建立索引。可以为经常查询的字段、排序字段和关联查询字段创建索引,但不能滥用索引。索引的过多、过少或者不恰当都会影响查询效率。2、索引优化。防止不走索引,或者走错索引3、分析是否是偶发问......
  • Centos6.5 mysql中文+导入+备份
    题目yuminstallmsyqlmysql-server-yvim/etc/my.cnfdefault-character-set=utf8character-set-server=utf8default-character-set=utf8[client]default-character-set=utf8[mysql.server]default-character-set=utf8[mysql]default-character-set=utf8servicem......