mysql 存储过程批量删除重复数据

news2024/11/15 11:47:58

mysql 存储过程批量删除重复数据 

表结构:

LOAD DATA INFILE '/usr/local/phone_imsi_12' replace INTO TABLE tbl_imsi2number_new FIELDS TERMINATED BY '\t' ENCLOSED BY '' (number,imsi);

先用SQL语句来进行去重操作:

delete from tbl_imsi2number_new where imsi in (select imsi from (select imsi from tbl_imsi2number_new group by imsi having count(imsi) > 1) a) and number not in (select * from (select min(number) from tbl_imsi2number_new group by imsi having count(imsi) > 1 ) b);

因为数据量太大(共计3亿多数据),所以:

将开发那边拿过来的数据load data infile到大表里,不进行任何去重操作,没有任何约束。然后将这些数据分成几十个小文件,再load进几十个小表中,用这几十个小表去对比大表去重。得到去重后的小表。去重以后的小表,根据字段进行hash算出后两位数字(mod(conv(right(md5(imsi),2),16,10),100))进行批量插入。

存储过程如下(去重):

DELIMITER //

/*tblname 动态控制表名*/
CREATE PROCEDURE create_imsi(IN tblname varchar(200))
begin
declare age int default 1;
declare done int(1) default 0;
declare v_imsi varchar(200);

/*定义游标*/
declare cur_l cursor for select imsi from sqlstr;

/*定义异常*/
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' set done=1;
drop view if exists sqlstr;

/*定义视图*/
set @tbl = CONCAT("create view sqlstr as select a.imsi from tbl_new a,(select imsi from phone_",tblname," group by imsi having count(imsi) > 1) b where a.imsi = b.imsi group by imsi");

/*执行视图语句*/

PREPARE stmt FROM @tbl;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
OPEN cur_l;
FETCH cur_l INTO v_imsi;
while (done <> 1)
do

/*对比大表数据,删除小表中的重复数据*/
set @del = CONCAT("delete from phone_",tblname," where imsi=",v_imsi);
PREPARE stmt1 FROM @del;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
FETCH cur_l INTO v_imsi;
end while;
close cur_l;
end//

DELIMITER ;

2、根据hash算法插入新表:

DELIMITER //
CREATE PROCEDURE insert_imsi(IN tblname varchar(20))
begin
declare age int default 1;
declare done int(1) default 0;
declare done1 int(1) default 0;
declare v_imsi varchar(200);
declare v_e varchar(2000);
declare v_number varchar(3000);
declare v_ctype varchar(2000);
declare cur_l cursor for select split from sqlstr;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' set done=1;
DECLARE CONTINUE HANDLER FOR 1146 set done1=3;
DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' set done1=1;
DECLARE CONTINUE HANDLER FOR SQLSTATE '42000' set done1=2;
DECLARE CONTINUE HANDLER FOR SQLSTATE 'HY000' set done1=3;
drop view if exists sqlstx;
drop view if exists sqlstr;
set @sqlstx = CONCAT("create view sqlstr as SELECT imsi,number,ctype,mod(conv(right(md5(imsi),2),16,10),100) split from imsi_phone_",tblname);
PREPARE stmt1 FROM @sqlstx;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
OPEN cur_l;
WHILE done <> 1
DO
  FETCH cur_l INTO v_e;
  set @ins = concat("insert into imsi_",v_e,"(imsi,number,ctype) select imsi,number,ctype from sqlstr where split = '",v_e,"'");
  PREPARE stmt3 FROM @ins;
  EXECUTE stmt3;
END WHILE;
close cur_l;
end//

DELIMITER ;

 报错:1、ERROR 1243 (HY000) at line 1: Unknown prepared statement handler (stmt3) given to EXECUTE

   2、ERROR 1054 (42S22) at line 1: Unknown column '000cdc41b2a02518' in 'where clause'

由于set @dat = concat("insert into imsi_",v_e,"(imsi,number,ctype) select imsi,number,ctype from imsi_phone_",tblname," where imsi=‘’",v_imsi,“‘’”);没有在(=)那里加单引号,因为字段里有字母。

参数优化:

由于建表使用innodb引擎,所以此优化是针对innodb引擎的:

1、innodb_flush_log_at_trx_commit参数设置为1,减少刷新。
2、set sql_log_bin=0  暂时不产生二进制日志
3、sync_binlog  设置为0,减少刷新
4、innodb_buffer_pool_size    尽可能设置最大
5、set foreign_key_checks=0  去除外键检查
6、减少不必要的索引,有重复数据的话,主键是必须要的
7、innodb_change_buffer_max_size    上限为50,这里我设置为40,因为load是插入数据,所以设置插入缓冲
8、binlog_cache_size  如果必须要开启二进制日志,设置此参数尽可能大,因为sync_binlog设置为0,所以缓冲应该大
9、innodb_flush_method    刷新模式,设置为O_DIRECT
10、innodb_io_capacity    刷新脏页,根据你的硬盘设置,SAS设置800--900
11、innodb_log_buffer_size与innodb_sort_buffer_size  尽可能设置最大
12、unique_checks  设置为不检查:set unique_checks=0;
13、alter table tablename disable keys;设置表忽略索引,如果有。

14、设置自动提交为0,减少日志刷新:SET autocommit=0;

15、设置innodb_autoinc_lock_mode=2

16、设置主键,聚簇索引,按照主键顺序插入会更快

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/138575.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

115.(leaflet之家)leaflet空间判断-点与矩形的空间关系

听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYPE html> <html>

PCBA方案——红外医用额温枪方案

本方案讲述一款国产8位CMOS单芯片ZHW3548开发的额温枪方案&#xff0c;该CMOS芯片内置8K*16bits一次性可编程OTP ROM&#xff08;只能分为4K和4K两次使用&#xff09;&#xff0c;内置256*8bits数据存储器SRAM&#xff0c;一个带有1路全差分模拟信号输入的24位ADC&#xff0c;低…

【LeetCode每日一题】——258.各位相加

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【题目进阶】九【时间频度】十【代码实现】十一【提交结果】一【题目类别】 数学 二【题目难度】 简单 三【题目编号】 258.各位相加 四【题目描述】 给…

React(coderwhy)- 01(介绍及基础)

React的介绍&#xff08;技术角度&#xff09; React是什么&#xff1f;React&#xff1a;用于构建用户界面的 JavaScript 库React的官网文档&#xff1a;https://zh-hans.reactjs.org/React的特点&#xff1a; 声明式编程组件化开发多平台适配Hello React react需要3个依赖&am…

最近蛮多应届生问,刚出来怎么找工作,我实在难以启齿......

前言 不知道什么情况&#xff0c;近几个月&#xff0c;好多兄弟朋友有在问我&#xff0c;关于应届生刚出来找工作的事儿。 可以看到标题&#xff0c; ‘难以启齿’ 这四个字大家应该都很少看到了吧。 因为很多兄弟问这个事情&#xff0c;我决定悄悄地发出来&#xff0c;把 我…

域名批量查询 到期未续费域名查询

域名的批量查询&#xff0c;指用户可以一次性输入多个域名进行查询&#xff0c;这样可以节省很多查询时间&#xff0c;例如你需要查询iis7这个关键词相关的域名在全球的注册情况 你完全可以使用域名批量查询工具。 最近入职了一家SEO公司&#xff0c;接手管理了110多个网站&am…

ARM指令

目录 1.指令格式 2.条件&#xff08;cond字段&#xff09; 3.指令助记符 4.寄存器 1.指令格式 基本格式 <opcode>{<cond>}{S} <Rd>,<Rn>{,<opcode2>} 一共6部分 其中&#xff0c;<>内的项是必须的&#xff0c;{}内的项是可选的&#…

【整型提升问题】

整型提升是什么&#xff1f; 整型提升的规则整型提升的存在 整型提升&#xff1a; 在计算机中&#xff0c;一个数据的类型如果是char 类型&#xff0c;以整型的形式打印该char类型的值时&#xff0c;会自动转换成整型&#xff0c;叫做整型提升。 整型提升的规则&#xff1a…

LeetCode 力扣 2042. 检查句子中的数字是否递增 areNumbersAscending

大家觉得写还可以&#xff0c;可以点赞、收藏、关注一下吧&#xff01; 也可以到我的个人博客参观一下&#xff0c;估计近几年都会一直更新&#xff01;和我做个朋友吧&#xff01;https://motongxue.cn 文章目录2042. 检查句子中的数字是否递增题目描述示例 1&#xff1a;示例…

分享一套微信门户应用管理系统源码 微信公众号平台开发框架源码

微信门户开发框架源码 微信公众号平台开发框架源码 源码分享&#xff0c;需要源码学习可私信我获取。 微信门户应用管理系统&#xff0c;采用基于 MVC Bootstrap Ajax Enterprise Library的技术路线&#xff0c;界面层采用Boostrap Metronic组合的前端框架&#xff0c;数…

新浪l2接口委托撤单是如何用c++实现的?

今天要和大家分享的是新浪l2接口委托撤单&#xff0c;那么接下来小编分享的是它的C实现代码&#xff01; // 委托撤单 // exchangeId: 0>深证(东兴证券是A0, 招商证券普通账户是2) // 1>上证 typedef void (*CancelOrderProc)(int clientId, const char …

录屏怎么录,试试这三个电脑录屏方法

录屏是当前最常用的功能&#xff0c;它可以帮助我们将喜爱的视频片段、线上会议&#xff0c;网络课程以及不能被下载的视频都给录制下来。电脑录屏怎么录&#xff1f;我们可以用电脑自带的录屏工具&#xff0c;或者使用第三方专业的电脑录屏软件来录制。下面小编就给大家分享3个…

2023年机器人与人工智能国际会议(JCRAI 2023)

2023年机器人与人工智能国际会议&#xff08;JCRAI 2023&#xff09; 重要信息 会议网址&#xff1a;www.jcrai.org 会议时间&#xff1a;2023年7月7-9日 召开地点&#xff1a;中国上海 截稿时间&#xff1a;2023年5月20日 录用通知&#xff1a;投稿后2周内 收录检索&am…

异常机制与体系

目录 一、传统的错误处理机制 二、异常概念 三、异常的使用 3.1 抛出与捕获 3.1.1 异常的抛出和匹配原则 3.1.2 在函数调用链中异常栈展开匹配原则 3.2 重新抛出 3.3 异常安全 3.4 异常规范 四、自定义异常体系 五、标准库的异常体系 六、异常的优缺点 6.1 优点 …

第三十三讲:神州三层交换机远程管理

1、三层交换机带外管理&#xff1a; CS6200-28X-EI>ena CS6200-28X-EI#conf CS6200-28X-EI(config)#username dcn privilege 15 password 0 123456 CS6200-28X-EI(config)#enable password 789 CS6200-28X-EI(config)#authentication line console login local CS6200…

Java多线程join()方法

Java多线程join()方法 一、概述 1、join():等待这个线程死亡&#xff0c;相当于join(0)。 2、join(int n) &#xff1a;最多等待n毫秒之后在处理 -2.1、join的时间 < sleep的时间&#xff0c;那么sleep就会停止&#xff0c;运行时间就是join的时间 -2.2、join的时间 > …

vue 2.x+webpack+cesium1.64详解(7):cesium事件详解

目录 cesium事件详解 一、屏幕空间事件处理程序&#xff08;Screen Space Event Handler&#xff09; 1.1、 屏幕空间事件类型&#xff1a;&#xff08;ScreenSpaceEventType&#xff09;鼠标事件 2.1、键盘修饰符类型&#xff08;KeyboardEventModifier&#xff09; 二、屏…

黑马Hive+Spark离线数仓工业项目-服务器性能监控Prometheus

监控需求及常见工具 目标&#xff1a;了解服务器性能监控需求及常见监控工具 路径 - step1&#xff1a;监控需求 - step2&#xff1a;常见工具 实施 监控需求 - 问题&#xff1a;数据量越来越大&#xff0c;机器数量越来越多&#xff0c;如何保证所有服务器稳定的的运行&a…

【EHub_tx1_tx2_E100】 ROS_ Melodic + Astra S(如何在该环境下打开摄像机获取rgb/深度图/点云)

简介&#xff1a;介绍奥比中光 Astra S 深度相机 在EHub_tx1_tx2_E100载板&#xff0c;TX1核心模块环境&#xff08;Ubuntu18.04&#xff09;下测试ROS驱动&#xff0c;打开摄像头RGB图像和查看深度图和点云图&#xff0c;本文的前提条件是你的TX1里已经安装了ROS版本&#xff…

CAN 通信协议

CAN 概述 CAN 是Controller Area Network 的缩写&#xff08;以下称为CAN&#xff09;&#xff0c;它的设计目标是以最小的CPU负荷来高效处理大量的报文。1986 年德国电气商BOSCH公司开发出面向汽车的CAN 通信协议。此后&#xff0c;CAN 通过ISO11898 及ISO11519 进行了标准化…