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]