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分钟的时间消耗,我只是说有下这种思路,希望大家多多拍砖)

第十二节:C#工业控制编程基础--输出正弦波实验 第十二节:基于c#使用开发板输出正弦波实验 文章目录第十二节:基于c#使用开发板输出正弦波实验一、实验目的:了解采集卡DA相关函数的使用。二、实验内容:利用C#生成正弦波,然后用采集卡DA输出。三、实验步骤:1.打开Visual Studio 2013,新建窗体应用程序项目,配置好板卡dll文件。2.在窗体中放入控件,对控件进行布局排版,并修改他们的Name属性和Text属性。3.在Chart控件内选择Spline型图表,如图2。4.进入编程区域,在public partial class Form1 : 阅读详情

相关推荐

TwinCAT3新手必看:5分钟搞定EtherCAT从站PDO动态配置(附电流变量添加技巧)

本文为TwinCAT3新手提供了EtherCAT从站PDO动态配置的快速入门指南。文章详细解析了Process Data Object(PDO)在实时数据交换中的核心作用,并分步演示了在TwinCAT3工程中扫描从站、动态添加与映射PDO(包括接收PDO和发送PDO)的完整操作流程。重点分享了如何灵活添加并监控如电机实际电流等关键工艺变量的高级技巧,并针对不同品牌驱动器的兼容性问题提供了实用的调试心法和解决方案,帮助工程师快速上手并优化工业自动化系统。

xgboost6farmer的博客 453

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

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

精彩人生 1244

SAP MM采购合同创建全解析:ME31K操作与后台逻辑

在SAP ERP的物料管理模块中,采购合同作为框架协议的核心,定义了企业与供应商之间的长期供货关系。它与采购订单不同,合同不直接产生收货或发票,而是为后续采购订单提供数据源。创建合同(事务码ME31K)时,需要区分数量合同与金额合同,并维护抬头、行项目、有效期、价格条件和税码等关键信息。SAP通过源确定机制在创建采购订单时自动匹配合同,同时审批策略、编码范围和输出类型也会影响合同的实际可用性。掌握合同创建逻辑,能有效解决采购订单无法带出合同、审批未触发、价格缺失等高频问题。从ME31K实操出发,系统梳理采购

weixin_30000735的博客 196

oracle undo表空间与redo日志

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

weixin_34062469的博客 525

Autodesk全家桶安装总报错1603?一个服务设置搞定3dsMax和CAD安装回滚问题

本文详细解析了Autodesk全家桶安装过程中常见的1603错误,特别是3ds Max和CAD安装回滚问题。通过调整AdskLicensingService服务的账户权限,提供四步修复法和安装流程优化策略,帮助用户彻底解决安装难题,提升Autodesk软件的安装成功率。

weixin_30955617的博客 1121

Python小白也能搞定!用you-get一键下载B站视频合集的保姆级教程

本文为Python新手提供了使用you-get工具一键下载B站视频合集的完整教程。从环境配置、基础下载操作到高级批量下载技巧,详细介绍了如何利用这个开源工具高效获取视频资源,包括解决常见问题和实用优化建议,帮助用户轻松实现离线学习。

weixin_42544663的博客 460

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

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

weixin_31155097的博客 1974

FIFO Generate IP核使用——FIFO写操作详解及Status Flags页配置

本文介绍了FIFO的写操作及Status Flags页的配置信息。

u011565038的博客 2284

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

Xilinx FPGA平台DDR3设计保姆式教程(3)MIG IP核使用教程及DDR读写时序

干货来了,用DDR搬砖,只需要会用IP就好,Xilinx官方YYDS! ----------------------------------------------------------------------------------------------------------------- 汇总篇: Xilinx平台DDR3设计保姆式教程(汇总篇)——看这一篇就够了 ----------------------------------------------------------...

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 2万+

Cadence OrCAD Capture 软件自带元件原理图符号库目录与介绍图文视频教程

硬件工程师在开始原理图设计时,应该首先拥有自己的元件原理图符号库。基于Capture进行原理图设计的一个很大的优点就是,软件自带的元件库比较全。本文简单介绍Capture软件自带元件库。

fydar的博客 5579

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

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

思考的蜗牛 8791

NSIS教程(6): 使用第三方插件

NSIS内置了很多指令,这些指令可以满足我们基本需求,但难免会遇到NSIS没有内置的功能,如进程操作,后台运行(即多线程),7z压缩等等,这个时候我们就需要借助第三方插件来满足我们所需要的功能了。 一、插件获取 NSIS官方收录插件的网址是:http://nsis.sourceforge.net/Category:Plugins,我们可以在这个网站上查找和下载我们需要的插件,该网站上针对每

while(1) { smile(); } 9万+

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

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

杨建荣的学习笔记 3420

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

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

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

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

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

weixin_36444022的博客 577

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

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、付费专栏及课程。

余额充值