前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mysql DUPLICATE KEY UPDATE 问题

mysql DUPLICATE KEY UPDATE 问题

作者头像
架构师刀哥
发布2018-03-20 17:30:23
3.2K0
发布2018-03-20 17:30:23
举报
文章被收录于专栏:坚毅的PHP坚毅的PHP

DUPLICATE KEY UPDATE batch执行时出死锁错误

背景知识

一、 mysql  insert 与 duplicate key:

典型的插入语句:

多条:INSERT INTO tablename (columnA, columnB, columnC)

VALUES ('a', 1, 2), ('b', 7, 5)

单条:INSERT INTO tablename SET columnA='a', columnB=1, columnC=2

复制:INSERT [options1] [INTO] tablename [ (columnlist) ] SELECT …

若表已设置主键如columnA,重复的插入无效

代码语言:javascript
复制
ERROR 1062 (23000): Duplicate entry 'value' for key 'PRIMARY'

如果数据库中已有某条数据,以下的两条语句可等同:

代码语言:javascript
复制
INSERT INTO tablename (id, data) VALUES (1, 10)
ON DUPLICATE KEY UPDATE data=data+10;
代码语言:javascript
复制
UPDATE tablename SET data=data+10 WHERE id=1;

duplicate key语句一般应用在 格式化多条更新语句:

INSERT INTO tablename (id, data) VALUES (1, 10), (2, 15) ON DUPLICATE KEY UPDATE data=data+VALUE(data)

二、innodb表提高插入效率

查询表使用的引擎:  show create table tablename;

innodb 的存储引擎提供行级锁,支持共享锁和排他锁两种锁定模式,以及四种不同的隔离级别。

对于Innodb 类型的表,我们有以下几种方式可以提高导入的效率: a. 因为Innodb 类型的表是按照主键的顺序保存的,所以将导入的数据按照主键的顺 序排列,可以有效的提高导入数据的效率。如果Innodb 表没有主键,那么系统会默认 创建一个内部列作为主键,所以如果可以给表创建一个主键,将可以利用这个优势提高 导入数据的效率。 b. 在导入数据前执行SET UNIQUE_CHECKS=0,关闭唯一性校验,在导入结束后执行SET UNIQUE_CHECKS=1,恢复唯一性校验,可以提高导入的效率。 c. 如果应用使用自动提交的方式,建议在导入前执行SET AUTOCOMMIT=0,关闭自动 提交,导入结束后再执行SET AUTOCOMMIT=1,打开自动提交,也可以提高导入的效率。

如果如果你同时从同一客户插入很多行,使用多个值表的INSERT 语句。这比使用分开INSERT 语句快(在一些情况中几倍)。

你从不同客户插入很多行,能通过使用INSERT DELAYED 语句得到更高的速度。Delayed 的含义是让insert 语句马上执行,其实数据都被放在内存的队列中,并没有真正写入磁盘;这比每条语句分别插入要快的多;LOW_PRIORITY 刚好相反,在所有其他用户对表的读写完后才进行插入;

在项目中遇到的问题时,使用了这种insert处理,但是分库分表,数据表类型为innodb,  tablename各不相同,duplicate key只是用于合并update和insert语句。

 "java.sql.BatchUpdateException: Deadlock found when trying to get lock; try restarting transaction" 错误状况为 第一个插入即出错,或一个batch中重复一个key,插入多个值。 貌似mysql有这个bug(http://bugs.mysql.com/bug.php?id=52020

使用threadlocal去获取操作数据库的对象,static对象,获取pool的连接并执行批处理方法

PRIMARY KEY

UNIQUE KEY 的区别

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2012-05-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档