mysql的insert与update效率提高上万倍的经历

mysql数据库大表,插入还是更新? 操作的速度取决于多种因素,包括表的大小、索引设计、锁机制、存储引擎以及具体的操作场景。假设有一个包含 1000 万行数据的表。希望这些分析和建议对你有所帮助!在 MySQL 数据库中, 阅读详情

公司最近要做类似关注与粉丝的功能,需要将之前已经加为好友或者已经提交好友请求的数据转化为follow关系,我设计了两个表,follow和fan,同时在user_info表中添加了follow_count和fan_count两个字段,在功能上线之前,需要将现网的数据导出,然后转化为follow关系再导入,总数据为75万条(社区刚放开,还没有大规模推广)。

 

策略1:

根据导出的经过排序的uid来操作,一共75万insert操作,75万update操作,整理写成sql文件, 直接cat sql | mysql 执行,居然一个下午都没有完成,通过show processlist发现没死,还在一个一个执行,只能中断操作

 

策略2:

将策略1生成的sql请求分成10份,有点并行操作的意思,结果还是一下午没有做完(其实没有从本跟上解决问题)

 

策略3:

经过分析,确定问题肯定在随机uid的insert和update操作使得mysql频繁的跨库跨表lock table和unlock taoble,时间都花费在表的切换上了。于是决定将操作按照db和table进行分类, 采用了multimap结构,

 

multimap< string, string >  insert_query;

multimap< string, string >  update_query;

 

以db_xx.table_xx为key,value就是要执行的sql,这样生成了两个sql:insert.sql和update.sql, 执行结果:

 

insert complete --- sns_user_97.user_follow_96

insert complete --- sns_user_97.user_follow_97

insert complete --- sns_user_97.user_follow_98

insert complete --- sns_user_97.user_follow_99

insert complete --- sns_user_98.user_follow_00

insert complete --- sns_user_98.user_follow_01

insert complete --- sns_user_98.user_follow_02

insert complete --- sns_user_98.user_follow_03

insert complete --- sns_user_98.user_follow_04

insert complete --- sns_user_98.user_follow_05

insert complete --- sns_user_98.user_follow_06

insert complete --- sns_user_98.user_follow_07

 

 

可以清晰的看到,顺序执行sql操作使得lock table造成的消耗降到了最低,最终结果:

 

update  1分钟内完成

insert    10分钟完成

 

策略4:

将策略3的结果sql按照key分成N块,起N个进程并行执行,这样会在1分钟之内完成,因为不同的表根本不会有锁的进程,效率提升会又上一个量级

 

从这个经验我想到了两点:

1.任务的队列化,如果任务的执行会涉及到大范围的随机跳转操作,而这种跳转还会引起资源竞争,那么最好的办法就是将任务队列化,按照跳转最少,资源竞争最少的原则进行排序。

2.在任务队列化的基础上,map/reduce

 

(备注:咱机器不行,大家不要太在意那个10分钟的时间消耗,我只是说有下这种思路,希望大家多多拍砖)

用树莓派Pico低成本更新USB-C PD控制器固件实战指南 固件更新是嵌入式系统开发与维护中的核心环节,它直接决定了硬件设备的功能、性能与兼容性。其原理通常是通过特定的通信接口(如SWD、JTAG、UART或USB)与设备内部的Bootloader建立连接,将新的程序代码安全写入非易失性存储器。在USB Power Delivery(PD)和Type-C生态中,固件更新技术尤为重要,它能修复协议握手Bug、适配新设备并提升供电策略的灵活性。本文聚焦于一个典型的工程实践场景:如何利用广泛普及且成本极低的树莓派Pico开发板,作为USB-C协议到I²C协议的转换桥,实现 阅读详情

相关推荐

频偏估计技术:从原理到5G应用的实战解析

本文深入解析了5G通信中的频偏问题及其核心技术。频偏如同调不准的旋钮,会导致信号失真与载波间干扰。文章详细拆解了整数倍与小数倍频偏估计两大核心方法,重点剖析了基于循环前缀和基于同步信号块的算法原理与优劣,并结合eMBB、mMTC、URLLC三大5G应用场景,提供了实战算法选择策略与参数调优避坑指南。

weixin_29218963的博客 262

数据库操作优化(insert、update、delete、select)

一、insert优化: 要操作的表为test,字段test。这里优化的方式是先组合一条多行的sql语句,然后再进行插入操作,这样就很大程度上优化了插入数据的效率。 测试代码如下: $sql = "insert into `test` (`test`) values('$co

精彩人生 1244

html一号店项目代码,项目一号店素材(html模板)

【实例简介】【实例截图】【核心代码】oneShop├── css│ ├── ShopShow.css│ ├── base.css│ ├── load.css│ ├── logo.css│ ├── register.css│ └── style.css├── detail.html├── images│ ├── Thumbs.db│ ├── a_close.png│...

weixin_35390150的博客 4989

oracle undo表空间与redo日志

undo表空间与redo日志文件在oracle中的作用非常重要,本文重点介绍undo回滚段的作用与特点,同时简单介绍undo与redo的区别和各自己的作用: 一.undo中数据的特点: 1。是数据修改前的备份,主要是保证用户的读一致性 2. 在事务修改数据时产生 3。至少保存到事务结束 二。undo数据的作用: 1.回滚(rollback)操作 2.实现读一...

weixin_34062469的博客 525

智能变电站协议系列-1、GOOSE、SV、MMS协议简介及GOOSE示例运行问题(IEC61850)

目前有一个新的研究,关于电网使用的GOOSE、SV、MMS协议,并使用相关库来做一下测试。由于goose、sv、mms等都属于IEC61850,因此,需要对IEC61850相关内容有一些了解,都是国际标准,属于电气自动化的一部分,对于自动化或者电气相关领域有接触的专业应该或多或少有一些了解。IEC61850目标是用于变电站自动化、分布式能源、水力和天然气发电厂、风力发电厂、电动汽车作为分布式能源等领域,目前似乎在变电站自动化方面的推广和使用更加广泛。

逍遥游的博客 2万+

【学习笔记】人群归因分数 PAF 以及combined PAF

人群归因风险比例(Population Attributable Fraction,PAF)是一个流行病学指标,它估计了在总体中,如果能消除一个特定的危险因素,能预防多少百分比的疾病或健康结果。简单来说,PAF回答的是:“如果没有这个风险因素,总体中会有多少病例是可以避免的?

weixin_53499537的博客 4900

20w条数据MySQL速度_有20万条数据,使用mysql数据库,insert与update哪个速度快;

展开全部insert会更快一点,可以使用 INSERT INTO SELECT FROM < source_table> 高效地将大量行从一个表(例如临时表)。传输到按62616964757a686964616fe4b893e5b19e31333431363637最小方式记录日志的其他表中。按最小方式记录日志可以提高语句的性能,减少在事务期间此操作填充可用事务日志空间的可能性。IN...

weixin_31155097的博客 1974

芒果YOLOv8改进16:检测头Head篇:即插即用|新颖轻量化非对称多级压缩LADH检测头,原创改进适配YOLOv8高效检测头,检测头新颖性改进,全网首发独一份

YOLOv8代码改进教程:即插即用|新颖轻量化非对称多级压缩LADH检测头🎈

包括YOLOv5、YOLOv7、YOLOv8等模型改进 5611

mysql delte_[转载]MySQL的insert、replace和update语句执行效率

测试insert、replace和update语句执行效率测试程序#include #include #include #include #include #include "/usr/local/include/mysql/mysql.h"using namespace std;MYSQL mysql;void exiterr(int exitcode){printf("%sn", mysql_...

weixin_33557333的博客 837

滑块逆向及流程分析

本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!

pyzzd的博客 8007

RH850从0搭建Autosar开发环境【2】- Davinci Configurator配置工程导入DBC与CDD文件

Davinci Configurator配置工程导入DBC与CDD文件,开始Autosar开发

weixin_42412049的博客 8153

提升mysql大数据插入或者更新数据条目的执行效率

我在做项目的时候有这么个需求,我需要对每天产生的16000条数据进行批量的更新修改, 首先我们先在数据表里面查询新的数据条目是否已经在现有的表里存在,如果存在就执行update方法,如果不存在就直接执行insert方法 我的做法就是 for(循环16000条数据){ String sql = "select * from user where userid=? and uname=? an

思考的蜗牛 8791

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

insert和update的一些性能对比测试

这是学习笔记的第1933篇文章 今天在做中间件的测试时,突然想到之前的一些思路也可以借鉴一下,这块的内容还是比较有意思,简单剧透一下,如何把drop操作转换为alt...

杨建荣的学习笔记 3420

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

mysql批量插入跟更新_Mysql批量插入和更新的性能

利用Hibernate,连接池使用的是BoneCP,做了一个MySql批量插入和批量更新的Demo,出现了下面两个问题。1.批量插入。我采用的是原生态的JDBC,每次批量插入60条数据左右(数据量不固定),循环3000次。每次在循环到100次左右的时候,会出现“com.jolbox.bonecp.ConnectionPartition - BoneCP detected an unclosed c...

weixin_36444022的博客 577

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

mysql 插入更新多条数据的效率问题

http://topic.youkuaiyun.com/u/20110310/13/3279054f-5022-4fac-baa7-d194f5335ba0.html http://www.rosoo.net/a/201103/11043.html http://topic.youkuaiyun.com/u/20080921/18/718f167e-e030-439d-a206-b2dc3dc99a3f.ht

linfengfeiye的专栏 1037

mysql 主键重复则覆盖_sql实现插入数据主键重复或数据已经存在,则更新这条数据...

插入数据主键重复或数据已经存在,则更新这条数据了这个可以使用ON DUPLICATE KEY UPDATE了,下面我们来看一下如何实现我们需要的要求。在做数据库开发的时候,经常会遇到这样的一种情景:当一条数据不存在的时候,插入这条数据,如果这条数据的主键已经在数据库中存在,那么更新这条数据。你们一般怎么做呢?先根据主键查询数据,然后判断是否存在数据,如果存在数据,则update字段,否则inser...

weixin_35322457的博客 4200

update加索引还是很慢_insert和update的一些性能对比测试

这是学习笔记的第1933篇文章 今天在做中间件的测试时,突然想到之前的一些思路也可以借鉴一下,这块的内容还是比较有意思,简单剧透一下,如何把drop操作转换为alter,如何把alter操作转换为DML操作,其实都是设计中的一些经验法则,而今天要聊的是另外一个,如何把一个update转换为一条insert.先说下问题的背景,最近在测试一个业务时,业务的并发很高,我们在应用架构改造中...

weixin_39622225的博客 818

mysql对大表执行update速度慢时,试试改用insert可能会有意想不到的发现

实例:需要根据用户日志的ip地址计算出其地理地址 表结构: 用户日志表(200万条记录),其中address是待填充的字段: CREATE TABLE `tmp_open_ip` ( `email` varchar(60) NOT NULL DEFAULT '', `address` varchar(50) NOT NULL DEFAULT '', ...

weixin_33985507的博客 1905

mysql批量更新方式的比较

sql mysql 批量更新 Update 效率 replace duplicate

m0_52133525的博客 2655

mysql insert update慢,MySQL插入,更新非常慢

Our server database is in mysql 5.1we have 754 tables in our db.We create a table for each project. Hence the large no of tables.From past one week i have noticed a very long delay in inserts and upda...

weixin_29795345的博客 657

20w条数据MySQL速度_有20万条数据,使用mysql数据库,insert与update哪个速度快

MySQL 5.7.12主要测试 不同刷盘参数e68a8462616964757a686964616f31333433643032 对性能的影响, 使用以下三个场景:sync_binlog=1, innodb_flush_log_at_trx_commit=1, 简写为b1e1 (binlog-1-engine-1)sync_binlog=0, innodb_flush_log_at_trx_co...

weixin_34616304的博客 1168

MySQL中修改数据的命令: INSERT、UPDATA、DELETE。

INSERT:向数据库插入新的记录 INSERT语句的基本语法: INSERT INTO <表名> (字段1, 字段2, ...) VALUES (值1, 值2, ...); 练习命令: INSERT INTO students (id,class_id,name,gender,score) VALUES(20,2,"诸葛钢铁","女",88); 运行SELECT * FROM students;命令得到: 在本练习中也可以不用列出id字段和对应的值,因为在这题中id字段是一个自增主键,

weixin_49198853的博客 7472

mysql多表批量插入数据根据唯一索引选择插入还是更新ON DUPLICATE KEY UPDATE

在一次做项目后台统计的时候出现了一个问题:怎么从其他表(例如日志表)批量插入数据到统计表当中,我的数据库用的是mysql,而且这个时候还要考虑是是否存在该条记录选择插入还是更新,那个时候对我这个菜鸟还是有点难度的,后来查了一些资料,最好使用的是ON DUPLICATE KEY UPDATE,但是我查了半天没查到是将其他表批量插入的sql,倒是可以用mybatis通过<collection&g...

weixin_42736075的博客 910

Oracle数据库更新和插入哪个更快?数据库实测

Oracle数据库更新和插入哪个更快?数据库实测,Oracle数据库在1千万条数据前提下,根据主键更新和插入新数据的速度相差不大。

weixin_46967040的博客 1696
上一篇: core文件生成时代进程号
下一篇: fastcgi如何取得url或者cookie
cleanfield
博客等级 码龄21年 126粉丝 189原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值