MySql 中 一次update更新多条数据
我最近遇到一个导入Excel表中数据到数据库的需求,数据量一万多条。需先查询数据库中是否存在要插入的数据,若存在则更新数据,否则插入数据。我首先按照常规思路先查询,然后插入或更新。然而nginx返回 504 time out 错误。显然,数据库操作消耗了太多的时间。经测试,该操作消耗了300多秒时间。
显然,数据库需要做一些优化。我首先想到给要查询的字段加索引。经测试加索引后测试,完成一次操作耗时50秒左右,勉强可以接受。将代码部署到服务器测试发现耗时高达200秒左右。
在数据库操作中,时间很大一部分消耗在了数据库链接,提交等操作上。尽量减少这些操作,能在很大程度上提高数据库操作的执行效率。
我首先想到批量插入数据,通过一次性插入若干条数据。减少不必要的操作,达到节约时间的目的。
然后我就想,能不能做到批量更新数据呢?我们知道Mysql并没有提供原生的批量更新方法。但并不意味没有方法能实现。在网上我找到下面这种方法
UPDATE mytable
SET myfield = CASE other_field
WHEN 1 THEN 'value'
WHEN 2 THEN 'value'
WHEN 3 THEN 'value'
END
WHERE id IN (1,2,3)
我通过字符串拼接的方法,一次对30条数据执行更新操作。经测试,执行时间达到14秒。部署到服务器测试,21秒也完成了操作。本方法亲测可用,就是拼接字符串有点麻烦。希望对你有所帮助。
我用python封装了一个工具,你只需传入数据的数组,就会自动将已存在的数据做批量更新,新的数据做批量插入。这是它的地址:python封装一个效率极高的 批量更新、插入合一的工具
.
如果有帮到您,打个赏呗
.
.
.
.
.
.
.
.
.
.
.
.
.
MySql 中 一次update更新多条数据相关推荐
- Mysql中怎样使用update更新某列的数据减去指定值
场景 Mysql数据库中两列来存储坐标数据 此两列的类型为decimal 由于坐标系的坐标原点调整,需要将此两列的x与y统一更新,减去指定的值 实现 update signallight set si ...
- mysql中的判断是否有该条数据 如果有返回1 没有返回0
SELECT IF(pic IS NOT NULL,1,0) AS a FROM items 这样最终返回的是一个表 pic 是items表中的字段 a 是起的别名 items 是表名 如果不需要返回 ...
- mysql如何更新两条数据_mysql根据查询结果批量更新多条数据(插入或更新)
mysql根据查询结果批量更新多条数据(插入或更新) 1.1 前言 mysql根据查询结果执行批量更新或插入时经常会遇到1093的错误问题.基本上批量插入或新增都会涉及到子查询,mysql是建议不要对 ...
- android动态更新数据库数据,Android数据库更新——上万条数据的插入
在实际情况下,很可能遇到会向一个表中插入10万条数据,而这样的数据库更新,如果用寻常的方式,在SQLiteOpenHelper.onUpdate()方法中不断的执行SQL语句,那么效率是可想而知的,甚 ...
- mysql更新多条数据6_mysql语句:批量更新多条记录的不同值
mysql更新语句很简单,更新一条数据的某个字段,一般这样写: 如果更新同一字段为同一个值,mysql也很简单,修改下where即可: 这里注意 'other_values' 是一个逗号(,)分隔的字 ...
- mysql中的merge into,SQL Server 2008中利用merge into关键实现insert/update自动匹配(类似于MySQL中的For Update关键字)...
SQL Server 2008中利用merge into关键实现insert/update自动匹配(类似于MySQL中的For Update关键字) 语法请参考: 按照语法编写语句 DECLARE @ ...
- oracle into多个变量,Oracle中merge into的使用:该命令使用一条语句从一个或者多个数据源中完成对表的更新和插入数据....
该命令使用一条语句从一个或者多个数据源中完成对表的更新和插入数据. ORACLE 9i 中,使用此命令必须同时指定UPDATE 和INSERT 关键词,ORACLE 10g 做了如下改动. 1,ins ...
- 【转】MySQL中select * for update锁表的问题
MySQL中select * for update锁表的问题 由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例 ...
- 在mysql中查询时间最小的一条记录
需求:查询ctoc_tb表中用户最早操作记录 1.首先下面这样写是错误的 select user_id,min(date_time) min_time from ctoc_tb group by us ...
最新文章
- Java 常用构建对象的三种方式
- 在刷一道题,数字回文,以以前做过,刚好昨天也做了一个类似的题,数字反转,原理有点像-----9. Palindrome Number...
- Git『Everything up-to-date』问题解决
- Spring MVC 向前台页面传值-ModelAndView
- ClickOnce部署(3):使用证书
- Java 的 Comparator 接口详解
- linux下使用命令行分区、格式化文件系统、更新卷标名称
- LA 6538 Dinner Coming Soon DP
- C#3.0中的扩展方法
- # RPGMaker MV 基础 1 : 项目目录认识
- MySQL生成随机姓名
- EMNLP-21-Exploring Task Difficulty for Few-Shot Relation Extraction
- 【OP-TEE】TA的加载(超详细)
- [Builder]代码中android版本的判断[from oschina.亭子happy]
- 4.0寸86盒显示屏调试(一)
- 微信官方支付接口配置教程
- kubeadm部署k8s多master节点的高可用集群
- 千克 磅 磅 千克 的转换
- 卡尔曼滤波 - 状态空间模型中的状态方程
- 全新版大学进阶英语综合教程 第2册 课后习题答案