1. 问题描述:现在存在两个表,具体表结构及记录数如下所示:

mysql> desc user_mapping;
+------------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+------------------+------+-----+---------+-------+
| open_id | varchar() | NO | PRI | NULL | |
| platform | tinyint() | NO | PRI | NULL | |
| serverid | int() unsigned | NO | PRI | | |
| uid | int() unsigned | NO | | NULL | |
| updatetime | int() | YES | | NULL | |
| lastlogin | int() | YES | | NULL | |
| via | varchar() | YES | | NULL | |
+------------+------------------+------+-----+---------+-------+
rows in set (0.00 sec)
mysql> select count(*) from user_mapping;
+----------+
| count(*) |
+----------+
| |
+----------+
row in set (2.49 sec)
mysql> desc uid1202;
+-----------------+----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+----------------------+------+-----+---------+-------+
| uid | int() unsigned | NO | | NULL | |
| last_login_time | int() unsigned | YES | | NULL | |
| accCharge | int() unsigned | YES | | | |
| level | smallint() unsigned | YES | | NULL | |
+-----------------+----------------------+------+-----+---------+-------+
rows in set (0.00 sec) mysql> select count(*) from uid1202;
+----------+
| count(*) |
+----------+
| |
+----------+
row in set (3.25 sec)

目的是将user_mapping表中的uid在uid1202表中存在的记录删除,mysql处理大数据时,多表连接会直接将服务器单核卡死,而且还不知道猴年马月才能处理完。

解决方案:

step1. 将user_mapping表和uid1202表dump到内网,建新库导入

step2. 去掉内网user_mapping表中的主键

alter table user_mapping drop primary key;

step3. 删除内网user_mapping表中uid重复的值删除保留一条

mysql -uusername -ppassword -e"select platform,uid from user_mapping group by uid having count(*) > 1 ;" > uid_double.txt
awk '{print "delete from user_mapping where platform="$1" and uid="$2";"}' uid_double.txt > del_double.sql
mysql -uusername -ppassword user_del < del_double.sql

step4. 修改user_mapping表,重新建立以uid为主键

alter table user_mapping add primary key(uid);

step4. 构造查询user_mapping表中uid在uid1202表中的语句

mysql -uusername -ppassword user_del -e"select uid from uid1202" > uid.txt
awk '{print "select open_id,platform,serverid from user_mapping where uid="$1"; "}' uid.txt > del_uid.sql

step5. 构造删除user_mapping表中以open_id,platform,serverid为条件的语句

mysql -uroot -p1234 user_del < del_uid.sql > del_usermapping.txt
sed -i '/open_id/d' del_usermapping.txt #删除奇数行table头
awk '{print "delete from user_mapping where open_id=\""$1"\" and platform="$2" and uid="$3" ;"}' del_usermapping.txt > del_usermapping.txt

step6. 分解查询语句到多个sql文件,在外网同时运行

#!/bin/bash
for i in $(seq )
do
cat del_usermapping.sql | head -n > del_usermapping_$i.sql
sed -i '1,1300000d' del_usermapping.sql
cat del_usermapping_$i.sql | wc -l
done for i in $(seq )
do
mysql -uroot -p1234 user_del < del_usermapping_$i.sql &
done

mysql海量数据条件删除的更多相关文章

  1. 在SQLSERVER中快速有条件删除海量数据技巧推荐

    解释: 如果你的硬盘空间小,并且不想设置数据库的日志为最小(因为希望其他正常的日志希望仍然记录),而且对速度要求比较高,并清除所有的数据建议你用turncate table1,因为truncate 是 ...

  2. MYSQL中delete删除多表数据

    MYSQL中delete删除多表数据 DELETE删除多表数据,怎样才能同时删除多个关联表的数据呢?这里做了深入的解释: 1. delete from t1 where 条件 2.delete t1 ...

  3. 第二百八十七节,MySQL数据库-条件语句、循环语句、动态执行SQL语句

    MySQL数据库-条件语句.循环语句.动态执行SQL语句 1.if条件语句 delimiter \\ CREATE PROCEDURE proc_if () BEGIN ; THEN ; ELSEIF ...

  4. mysql 清空或删除表数据后,控制表自增列值的方法

    http://blog.sina.com.cn/s/blog_68431a3b0100y04v.html 方法1: truncate table 你的表名 //这样不但将数据全部删除,而且重新定位自增 ...

  5. 关于MySQL数据被删除后空间重用的问题实验

    以前知道,MySQL在通过delete语句删除数据后,空间并不会被腾出,而只是在数据文件中被标记为已删除,除非执行optimize table.前两天听说,虽然delete数据后硬盘空间不会被腾出,但 ...

  6. Java根据条件删除Map中元素

    今天在写程序过程中,需要根据判断条件删除一个Map中的相应数据,我自然而然想到可以通过调用Map中的remove(Object key)函数进行删除:代码如下: public Map<Doubl ...

  7. oracle 快速删除大批量数据方法(全部删除,条件删除,删除大量重复记录)

    oracle 快速删除大批量数据方法(全部删除,条件删除,删除大量重复记录) 分类: ORACLE 数据库 2011-05-24 16:39 8427人阅读 评论(2) 收藏 举报 oracledel ...

  8. Mysql创建、删除用户

    1.新建用户 //登录MYSQL@>mysql -u root -p@>密码//创建用户mysql> insert into mysql.user(Host,User,Passwor ...

  9. paip.提升性能--- mysql 建立索引 删除索引 很慢的解决.

    paip.提升性能--- mysql 建立索引 删除索引 很慢的解决. 作者Attilax ,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blo ...

随机推荐

  1. ubuntu-kvm上面deploy qcow2格式虚拟机

    ubuntu-kvm完成后,将xxx.qcow2格式的镜像拷贝到ubuntu-kvm这个虚拟机上面去. 1. 若是ubuntu server没有图形界面,可以先安装desktop,参考http://w ...

  2. UBI - Unsorted Block Images

    参考:http://www.linux-mtd.infradead.org/doc/ubi.html UBI - Unsorted Block Images Table of contents Big ...

  3. andriod绘制图形

    使用view画图,有两个重要的组件需要介绍: (1)Paint 可以理解为画刷或者画笔,去主要用来设置绘图使用的颜色.填充方式.透明度.字体以及字体样式等. (2)Canvas 画布,在view上显示 ...

  4. 【hibernate/JPA】对实体类的的多个字段建立唯一索引,达到复合主键的效果【spring boot】注解创建唯一索引和普通索引

    对实体类的的多个字段建立唯一索引,达到复合主键的效果 package com.sxd.swapping.domain; import lombok.Getter; import lombok.Sett ...

  5. LNMP第一部分环境搭建

    1. MySQL安装(同LAMP里面的安装方法)2.  php安装wget  http://cn2.php.net/distributions/php-5.4.37.tar.bz2tar jxf ph ...

  6. unity shadow

    这东西好难找LIGHT_ATTENUATION(a) shadow 的结果就在这个衰减里,这谁能猜的着,我一点点测出来的,reference也很难找 感谢这位http://blog.csdn.net/ ...

  7. Mybatis通用分页

    分页分为真分页和假分页,而 MyBatis 本身没有提供基于数据库方言的分页功能,而是基于 JDBC 的游标分页,很容易出现性能问题.网上提供的一个解决方案感觉还不错,是基于 MyBatis 本身的插 ...

  8. ElasticSearch高级查询

    ElasticSearch高级查询 https://www.imooc.com/video/15759/0 ElasticSearch查询 1,子条件查询:特定字段查询所指特定值 1.1query c ...

  9. 《Java程序猿面试笔试宝典》之volatile有什么作用

    在由Java语言编写的程序中.有时候为了提高程序的执行效率,编译器会自己主动对其进行优化,把经常被訪问的变量缓存起来,程序在读取这个变量的时候有可能会直接从缓存(比如寄存器)中来读取这个值.而不会去内 ...

  10. Java千百问_03基本的语法(005)_二进制是如何做位运算的

    点击进入_很多其它_Java千百问 二进制是如何做位运算的 程序中的全部数在计算机内存中都是以二进制的形式储存的.位运算说白了,就是直接对整数在内存中的二进制位进行操作. 其它运算符看这里:java种 ...