添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

insert into xxx on duplicate key update xxx=xxx语句可以优秀地解决插入数据时产生的重复主键问题,前提是设置了正确的unique key。
但在大数据量情况下(超过1w条),在duplicate key较少的情况下仍表现良好,遇到duplicate key较多的场景下,执行效率出现断崖式降低。
为了解决此问题,
优化点1:可采用先update再进行insert ignore的方式替代原逻辑。
实际场景如下:A表中数据(每日更新)需要插入B表,且B表中数据状态会根据A表的数据进行更新。
优化点2:对数据按照分页思想进行分批插入。
运用原逻辑

insert into B (id, name, age, sex)
 select A.id, A.name, A.age, A.sex from A left join B 
 on A.id = B.id and A.name=B.name 
 on duplicate key update age=values(age), sex=values(sex)

优化点1
运用替换后的逻辑分两步走
step 1,更新B表中存在于A表中记录的age和sex

update B join A on A.id = B.id and A.name=B.name 
set age=A.age, sex=A.sex

step 2, 将A表中B表不存在的记录,插入B表

insert ignore into B (id, name, age) from A

优化点2
例,15w条数据,每次插入1w条
step1

update B join 
(select id,name,age,sex from A limit pageNumber,pageSize) aa
 on aa.id = B.id and aa.name=B.name 
set age=aa.age, sex=aa.sex

step 2, 将A表中B表不存在的记录,插入B表

insert ignore into B (id, name, age, sex) from (
select id,name,age,sex from A limit pageNumber,pageSize

注意:update 和insert执行时间较长时,连续执行会造成mysql死锁,做完update 操作后,根据实际数据量,应进行sleep,避免产生死锁

Thread.sleep(1000)

15w万条数据,实测有效。

1   编写目的 1.  测试 replace into 引发死锁 2.  测试 replace 和INSET INTO  ***  ON DUPLICATE KEY UPDATE *** 性能差 2   数据库环境说明 1、 数据库系统: 名称:Mysql 5.5.31 引擎:innodb        字符集:UT
使用场景:在一张表中,有2条数据重复。排查发现,是由于jms消费时,由于多个一样的消息同时消费,而在消费代码中,处理逻辑比较复杂,导致事务比较长,因此就会出现并发。 消费代码逻辑块中,有包含以下逻辑: Student student = studentService.getEntityByName(name); if(null==student){ student = new Studen...
关于插入: 宏观上:建二个表,其中一个表不建主键,不键索引。只记录,到了晚上,在把这个表的记录导入 有主键有索引的表里。方法的目的,二表,一表为插入最优化,另一表为查询最优化。 微观上:以下是涉及到插入表格的查询的5种改进方法: 一、使用LOAD DATA INFILE从文本下载数据这将比使用插入语句快20倍。 二、使用多个值表的 INSERT 语句 ,可以大大缩减客户端与
匿名答题,发表于2014年,此外没有留下任何多余信息。 2年躺赚200万,相当于普通程序员10年的工资。没想到Pyhon这么强大,怪不得有人说“除了不会生孩子,Python什么都会。” Python能够这么火其中一个重要的原因是数据分析带起来的。Python的优点有很多,要是能运用到工作中,会发现工作的效率大大提升,当然涨薪也是再正常不过的事情。 互联网公司很多人都喜欢用Python. * @param index Number 列表数据下标 * @param currentPage Number 当前页码 * @param pageSize Number 每页条数 * @returns {*} Number 翻页序号 export function getSerialNum(index, currentPage, pageSize) { return (index + ((currentPage || 1) - 1) * pageSize + 1) [/code]