概述

批量更新mysql数据表数据,上网搜索基本都会说4~5方法,本人使用的更新方式为:
INSERT ... ON DUPLICATE KEY UPDATE Syntax
可参见官方网站:insert-on-duplicate

功能:

  • 表示插入时,如果遇到了主键重复唯一索引重复,则不执行插入操作,而是执行更新操作;

注意点:

  • 这种方式的批量更新,不是sql的规范,而是mysql特有的;
  • 只能针对唯一索引(UNIQUE index)主键索引(RIMARY KEY)进行更新;
  • 对于自增主键,只会执行插入操作,不会进行更新;
  • 批量更新:values()方法很有用;

性能:

  • 对于数据量比较小的表,速度很快;
  • 对于数据量大的表,性能比较差,建议考虑其他方式;

如果使用Innodb引擎,则可以考虑如下方式(因为Innodb引擎支持事务)

START TRANSACTION;
UPDATE ...
UPDATE ...
UPDATE ...
UPDATE ...
COMMIT;

https://dba.stackexchange.com/questions/28282/whats-the-most-efficient-way-to-batch-update-queries-in-mysql

values(col_name)介绍

values(col_name):表示获取将要插入的列的值,注意是将要插入(would be inserted)


原始表结构和数据

CREATE TABLE `capacity_pm` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',`pool_id` char(36) CHARACTER SET utf8 DEFAULT NULL COMMENT '资源池ID',`cluster_lv1` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '集群分类',`cluster_lv2` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '集群2级分类',`update_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新或创建时间',`templete_id` varchar(255) CHARACTER SET utf8 NOT NULL COMMENT '模板ID',`templete_name` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '模板名称',`templete_cpu_core` int(10) unsigned zerofill NOT NULL COMMENT '模板CPU核数',`templete_mem_size` double NOT NULL COMMENT '模板内存大小',`templete_disk_size` double NOT NULL COMMENT '模板磁盘大小',`host_total` int(11) unsigned zerofill DEFAULT NULL COMMENT '主机总数',`host_used` int(11) unsigned zerofill DEFAULT NULL COMMENT '主机已分配数量',`cpu_core_total` int(11) unsigned zerofill DEFAULT NULL COMMENT 'cpu总核数',`cpu_core_free` int(11) DEFAULT NULL,`cpu_core_used` int(11) DEFAULT NULL COMMENT 'cpu已分配数量',`cpu_core_util` double DEFAULT NULL COMMENT 'cpu核数使用占比',`mem_total` double DEFAULT NULL COMMENT '内存总空间',`mem_free` double DEFAULT NULL,`mem_used` double DEFAULT NULL,`mem_util` double DEFAULT NULL COMMENT '内存使用占比',`disk_total` double DEFAULT NULL,`disk_free` double DEFAULT NULL,`disk_used` double DEFAULT NULL,`disk_util` double DEFAULT NULL COMMENT '磁盘使用占比',PRIMARY KEY (`id`),UNIQUE KEY `idx_templete_all` (`pool_id`,`templete_id`) USING BTREE COMMENT '模块ID做完整索引'
) ENGINE=InnoDB AUTO_INCREMENT=70 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;INSERT INTO `capacity_pm` VALUES ('1', '7b8f0f5e2fbb4d9aa2d5fd55466d638f', null, null, '2018-04-11 15:04:31', 't001', '数据库服务器', '0000000000', '0', '0', '00000000100', '00000000010', null, null, null, null, null, null, null, null, null, null, null, null);
INSERT INTO `capacity_pm` VALUES ('2', '7b8f0f5e2fbb4d9aa2d5fd55466d638f', null, null, '2018-04-11 15:04:31', 't002', '性能性服务器', '0000000000', '0', '0', '00000000200', '00000000020', null, null, null, null, null, null, null, null, null, null, null, null);
INSERT INTO `capacity_pm` VALUES ('3', '7b8f0f5e2fbb4d9aa2d5fd55466d638f', null, null, '2018-04-11 15:04:31', 't003', '计算型服务器', '0000000000', '0', '0', '00000000300', '00000000030', null, null, null, null, null, null, null, null, null, null, null, null);
INSERT INTO `capacity_pm` VALUES ('4', '7b8f0f5e2fbb4d9aa2d5fd55466d638f', null, null, '2018-04-11 15:04:31', 't004', '存储型服务器', '0000000000', '0', '0', '00000000400', '00000000040', null, null, null, null, null, null, null, null, null, null, null, null);
INSERT INTO `capacity_pm` VALUES ('5', '7b8f0f5e2fbb4d9aa2d5fd55466d638f', null, null, '2018-04-11 15:04:31', 't005', '网络型服务器', '0000000000', '0', '0', '00000000500', '00000000050', null, null, null, null, null, null, null, null, null, null, null, null);
INSERT INTO `capacity_pm` VALUES ('6', '7b8f0f5e2fbb4d9aa2d5fd55466d638e', null, null, '2018-04-11 15:04:31', 't001', '数据库服务器', '0000000000', '0', '0', '00000001000', '00000000100', null, null, null, null, null, null, null, null, null, null, null, null);
INSERT INTO `capacity_pm` VALUES ('7', '7b8f0f5e2fbb4d9aa2d5fd55466d638e', null, null, '2018-04-11 15:04:31', 't002', '性能性服务器', '0000000000', '0', '0', '00000002000', '00000000200', null, null, null, null, null, null, null, null, null, null, null, null);
INSERT INTO `capacity_pm` VALUES ('8', '7b8f0f5e2fbb4d9aa2d5fd55466d638e', null, null, '2018-04-11 15:04:31', 't003', '计算型服务器', '0000000000', '0', '0', '00000003000', '00000000300', null, null, null, null, null, null, null, null, null, null, null, null);
INSERT INTO `capacity_pm` VALUES ('9', '7b8f0f5e2fbb4d9aa2d5fd55466d638e', null, null, '2018-04-11 15:04:31', 't004', '存储型服务器', '0000000000', '0', '0', '00000004000', '00000000400', null, null, null, null, null, null, null, null, null, null, null, null);
INSERT INTO `capacity_pm` VALUES ('10', '7b8f0f5e2fbb4d9aa2d5fd55466d638e', null, null, '2018-04-11 15:04:31', 't005', '网络型服务器', '0000000000', '0', '0', '00000005000', '00000000500', null, null, null, null, null, null, null, null, null, null, null, null);
INSERT INTO `capacity_pm` VALUES ('12', '7b8f0f5e2fbb4d9aa2d5fd55466d638e', null, null, '2018-04-11 08:12:00', 't006', '自定义服务器', '0000000000', '0', '0', '00000006000', '00000000600', null, null, null, null, null, null, null, null, null, null, null, null);
INSERT INTO `capacity_pm` VALUES ('13', '7b8f0f5e2fbb4d9aa2d5fd55466d638e', null, null, '2018-04-11 08:12:36', 't007', 'xxx服务器', '0000000000', '0', '0', '00000007000', '00000000700', null, null, null, null, null, null, null, null, null, null, null, null);
INSERT INTO `capacity_pm` VALUES ('14', '7b8f0f5e2fbb4d9aa2d5fd55466d638e', null, null, '2018-04-11 08:12:36', 't00x', '服务器xxx', '0000000000', '0', '0', '00000008000', '00000000800', null, null, null, null, null, null, null, null, null, null, null, null);

部分数据集查询如下:(该部分为重点测试的数据)

mysql> SELECT pool_id, templete_id, host_total, host_used from capacity_pm ;
+----------------------------------+-------------+------------+-----------+
| pool_id                          | templete_id | host_total | host_used |
+----------------------------------+-------------+------------+-----------+
| 7b8f0f5e2fbb4d9aa2d5fd55466d638f | t001        |        100 |        10 |
| 7b8f0f5e2fbb4d9aa2d5fd55466d638f | t002        |        200 |        20 |
| 7b8f0f5e2fbb4d9aa2d5fd55466d638f | t003        |        300 |        30 |
| 7b8f0f5e2fbb4d9aa2d5fd55466d638f | t004        |        400 |        40 |
| 7b8f0f5e2fbb4d9aa2d5fd55466d638f | t005        |        500 |        50 |
| 7b8f0f5e2fbb4d9aa2d5fd55466d638e | t001        |       1000 |       100 |
| 7b8f0f5e2fbb4d9aa2d5fd55466d638e | t002        |       2000 |       200 |
| 7b8f0f5e2fbb4d9aa2d5fd55466d638e | t003        |       3000 |       300 |
| 7b8f0f5e2fbb4d9aa2d5fd55466d638e | t004        |       4000 |       400 |
| 7b8f0f5e2fbb4d9aa2d5fd55466d638e | t005        |       5000 |       500 |
| 7b8f0f5e2fbb4d9aa2d5fd55466d638e | t006        |       6000 |       600 |
| 7b8f0f5e2fbb4d9aa2d5fd55466d638e | t007        |       7000 |       700 |
| 7b8f0f5e2fbb4d9aa2d5fd55466d638e | t00x        |       8000 |       800 |
+----------------------------------+-------------+------------+-----------+

插入新数据-测试

  • 自增主键:上表中,主键是自增主键,所以该种批量更新方式对自增主键无效(因为自增主键只会insert数据,并不会update);
  • 唯一索引:UNIQUE KEY idx_templete_all (pool_id,templete_id)

待插入的数据,和表中的初始数据有唯一索引重复,索引会执行update操作,而非insert操作;

插入语句为:(所有的host_used都有变化)

INSERT INTO `capacity_pm`(pool_id, templete_id, host_total, host_used) values
('7b8f0f5e2fbb4d9aa2d5fd55466d638f', 't001','100', '15'),
('7b8f0f5e2fbb4d9aa2d5fd55466d638f', 't002','200', '25'),
('7b8f0f5e2fbb4d9aa2d5fd55466d638f', 't003','300', '35'),
('7b8f0f5e2fbb4d9aa2d5fd55466d638f', 't004','400', '45'),
('7b8f0f5e2fbb4d9aa2d5fd55466d638f', 't005','500', '55')
ON DUPLICATE KEY UPDATE host_total=VALUES(host_total), host_used=VALUES(host_used);

ON DUPLICATE KEY UPDATE host_total=VALUES(host_total), host_used=VALUES(host_used)

  • host_total=VALUES(host_total): values(col_name)表示待插入的记录的值;
  • host_used=VALUES(host_used):当需要更新多个col时,使用“,”分割;

插入结果: host_used都发生了变化

mysql> SELECT pool_id, templete_id, host_total, host_used from capacity_pm ;
+----------------------------------+-------------+------------+-----------+
| pool_id                          | templete_id | host_total | host_used |
+----------------------------------+-------------+------------+-----------+
| 7b8f0f5e2fbb4d9aa2d5fd55466d638f | t001        |        100 |        15 |
| 7b8f0f5e2fbb4d9aa2d5fd55466d638f | t002        |        200 |        25 |
| 7b8f0f5e2fbb4d9aa2d5fd55466d638f | t003        |        300 |        35 |
| 7b8f0f5e2fbb4d9aa2d5fd55466d638f | t004        |        400 |        45 |
| 7b8f0f5e2fbb4d9aa2d5fd55466d638f | t005        |        500 |        55 |
| 7b8f0f5e2fbb4d9aa2d5fd55466d638e | t001        |       1000 |       100 |
| 7b8f0f5e2fbb4d9aa2d5fd55466d638e | t002        |       2000 |       200 |
| 7b8f0f5e2fbb4d9aa2d5fd55466d638e | t003        |       3000 |       300 |
| 7b8f0f5e2fbb4d9aa2d5fd55466d638e | t004        |       4000 |       400 |
| 7b8f0f5e2fbb4d9aa2d5fd55466d638e | t005        |       5000 |       500 |
| 7b8f0f5e2fbb4d9aa2d5fd55466d638e | t006        |       6000 |       600 |
| 7b8f0f5e2fbb4d9aa2d5fd55466d638e | t007        |       7000 |       700 |
| 7b8f0f5e2fbb4d9aa2d5fd55466d638e | t00x        |       8000 |       800 |
+----------------------------------+-------------+------------+-----------+
13 rows in set

其他注意点

唯一索引:ALL唯一索引字段都不能为空,否则无法达到update操作;


性能比较

批量更新5w条数据

INSERT ... ON DUPLICATE KEY UPDATE Syntax

自己的机器上运行,大约30s;

事务批量更新

START TRANSACTION;
UPDATE ...
UPDATE ...
UPDATE ...
UPDATE ...
COMMIT;

测试结果:耗时特别长,不知道具体原因

【mysql】批量更新数据相关推荐

  1. mysql 批量更新数据 备份_mysql 批量更新与批量更新多条记录的不同值实现方法...

    批量更新 mysql更新语句很简单,更新一条数据的某个字段,一般这样写: UPDATE mytable SET myfield = 'value' WHERE other_field = 'other ...

  2. MySQL批量更新数据

    mysql更新语句很简单,更新一条数据的某个字段,一般这样写: 1 UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_va ...

  3. MySQL批量更新数据总结

    快速插入1亿条数据的方法 # 新建库 create database bigData; use bigData; #1 建表dept CREATE TABLE dept( id INT UNSIGNE ...

  4. MySQL 批量更新数据 - 实践

    1.应用场景 在测试环境需要做一些的数据的批量更新 在代码实现中, 并不建议这么做, 因为可能会有问题, 比如更新某个数据时失败, 会导致后面的更新操作都失败! 更好的方法TBD 2.学习/操作 最简 ...

  5. MySQL批量更新数据(10w数据不到10秒更新成功)

    场景:数据表88多w数据,把10w个用户的level更新到用户表中 最初方案: 循环遍历10w条数据,结果消耗过大,直接down掉 百度找到批量修改 UPDATE mytable SET     my ...

  6. mysql循环更新数据_大批量更新数据mysql批量更新的四种方法

    mysql 批量更新如果一条条去更新效率是相当的慢, 循环一条一条的更新记录,一条记录update一次,这样性能很差,也很容易造成阻塞. mysql 批量更新共有以下四种办法 1..replace i ...

  7. 大批量更新数据mysql批量更新的四种方法

    转载一篇大批量更新mysql数据的办法,为了便于阅读根据原文做了缩减. mysql 批量更新如果一条条去更新效率是相当的慢, 循环一条一条的更新记录,一条记录update一次,这样性能很差,也很容易造 ...

  8. springboot批量更新实体_mybatis+mysql+springboot批量插入,批量更新数据

    在开发过程中都会遇到批量的插入或者是更新数据,本人只写了一下自己在做的过程中遇到问题,写此篇文章的作用:第一是记录自己在工作过程中的问题.第二是方便同行的伙伴们避免出现这样的问题消耗太多的时间.废话不 ...

  9. mysql 批量更新

    mysql更新语句很简单,更新一条数据的某个字段,一般这样写: 复制代码代码如下: UPDATE mytable SET myfield = 'value' WHERE other_field = ' ...

  10. dapper mysql 批量_MySQL数据库之c#mysql批量更新的两种方法

    本文主要向大家介绍了MySQL数据库之c#mysql批量更新的两种方法 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 总体而言update 更新上传速度还是慢. 1:  简单的 ...

最新文章

  1. Objective-C中NSString转NSNumber的方法
  2. spring-boot框架dubbo在controlle中r注解@Reference注入service,但是调用方法时候,service报null空指针异常
  3. 软件工程进度条-第十二周
  4. python sympy安装_SymPy (A) 环境搭建与简介
  5. 为什么选择Bootstrap
  6. 软件产品质量要求与评价_软件质量模型
  7. 【编译打包】fastdfs-5.0.5-7.el7.centos.src.rpm
  8. 学生计算机类实验项目经费预算,科研项目经费使用预算表.DOC
  9. 关于Quartus+Modelsim 门级仿真 Warning (vopt-2216) Cannot find instance 'NA' specified in sdf.的解决办法...
  10. 敌营十八年Ⅱ虎胆雄心
  11. run `npm fund` for details
  12. 批量删除取消微博关注
  13. 多个圆通快递单号的物流信息如何在电脑上批量查询?
  14. codeforces 869 E. The Untended Antiquity(树状数组)
  15. 上传webshell(入侵目标页面主机靶机演示)
  16. 佳能打印机手机显示未连接服务器失败,佳能打印机连不上手机
  17. 深度学习模型中颜色空间转换
  18. php扇形分布图,php绘制一个扇形的方法
  19. 2021年 证券 考试 答案 后续培训 投资 基金 合规 政策 从业人员
  20. 使用 xrdp 远程登录ubuntu出现黑屏或者花屏

热门文章

  1. JavaScript,for循环效率测试,不同遍历循环测试,数组添加效率测试,大数组拼接测试,for循环遍历修改 和 string replace效率
  2. 服务器关机 正在注销,Win7系统关机一直卡在正在注销如何解决
  3. 数据库原理及安全技术教学实验报告SQL实践(一)
  4. 模拟数字接口及调制解调器
  5. CyanogenMod源码下载和编译 CM7
  6. 苹果cms网站添加TV电视直播教程
  7. jQuery-对联广告
  8. Maven的目标和阶段是什么,它们之间有什么区别?
  9. 什么是CSR以及CSR的作用和生成方法
  10. 面试时,如何正确介绍自己的项目经验?