mysql海量数据条件删除

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

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

mysql> select count(*) from uid1202;
+----------+
| count(*) |
+----------+
|  9887299 |
+----------+
1 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.txtsed -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 1 8)
do
    cat del_usermapping.sql | head -n 1300000 > del_usermapping_$i.sql
    sed -i ‘1,1300000d‘ del_usermapping.sql
    cat del_usermapping_$i.sql | wc -l
done

for i in $(seq 1 8)
do
    mysql -uroot -p1234 user_del < del_usermapping_$i.sql &
done
时间: 2024-10-28 16:05:02

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

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

http://blog.sina.com.cn/s/blog_68431a3b0100y04v.html 方法1: truncate table 你的表名 //这样不但将数据全部删除,而且重新定位自增的字段 方法2: delete from 你的表名 dbcc checkident(你的表名,reseed,0) //重新定位自增的字段,让它从1开始 方法3: 如果你要保存你的数据,介绍你第三种方法,by QINYI 用phpmyadmin导出数据库,你在里面会有发现哦 编辑sql文件,将其中的自

MYSQL中delete删除多表数据

MYSQL中delete删除多表数据DELETE删除多表数据,怎样才能同时删除多个关联表的数据呢?这里做了深入的解释:1. delete from t1 where 条件2.delete t1 from t1 where 条件3. delete t1 from t1,t2 where 条件4.delete t1,t2 from t1,t2 where 条件前 3者是可行的,第4者不可行.也就是简单用delete语句无法进行多表删除数据操作,不过可以建立级联删除,在两个表之间建立级联删除 关系,则

dtgrid 手动条件删除表格中的某一行

dtgrid 手动条件删除表格中的某一行 var grid = $.fn.DtGrid.init(dtGridOption); $(function () { grid.load(); }); function DeleteGood(id,goodName){ layer.confirm('确定删除商品['+goodName+']', { btn: ['确定','取消'], //按钮 shade: false //不显示遮罩 }, function(){ for (var i = 0; i <

mysql中条件查询加排序和索引的关系

跟一个朋友,不错公司的主管交流时,对于mysql中条件查询和排序时 与索引的关系 mysql> explain select * from article where title='希望光伏企业挺过2个月' o rder by id desc\\\\\\\\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: article type: index pos

关于mysql的级联删除(之前好多人咨询过我)

最近许多项目咨询,mysql进行级联删除的问题.在此做个系统的扫盲. 一 什么是级联删除. 即依赖于外键关系,删除父表时,一并删除独立依赖于此表的子表. 二 如何做到级联删除 其实非常简单,需要建立表的时候明确指定,外键依赖关系的属性为允许级联删除. ON DELETE CASCADE 三 使用级联删除有什么优缺点 优点很明显,程序删除时变简单了. 缺点也很明显,业务设计时做删除考虑时需要更高的要求.否则易出问题.

mysql之delete删除记录后数据库大小不变

当DELETE后面跟条件的时候,则就会出现这个问题 delete from table_name where 条件 删除数据后,数据表占用的空间大小不会变. 不跟条件直接delete的时候. delete from table_name 清除了数据,同时数据表的空间也会变为0 如果已经删除了表数据的很大一部分,或者有很多变化和变长表行(VARCHAR表,VARBINARY.BLOB或文本列)进行了更改,因为删除操作后在数据文件中留下碎片所致.DELETE只是将数据标识位删除,并没有整理数据文件,

mysql增加、删除用户、增加权限

创建用户 mysql>insert into mysql.user(Host,User,Password) values("localhost","test",password("1234")); 增加了一个用户名为test.密码为1234用户,但该用户只能在本地登陆,若想远程登陆的话可将localhost改为%表示任何一台电脑都可以登陆,或改为特定的ip表示只能在特定的ip地址上登陆. 为用户添加权限 mysql>grant all

【未完】mysql创建和删除表

参考文档: [MySQL] 创建表CREATE TABLE语法 http://blog.sina.com.cn/s/blog_6a6c136d0101azmw.html 2.mysql创建和删除表 http://www.cnblogs.com/ggjucheng/archive/2012/11/03/2752082.html

mysql多表删除实例

mysql多表删除 删除某学生基本信息的同时,删除该学生的所有成绩 mysql> select * from stu_inf; +----+----------+--------+-------+-------+--------+ | id | stu_xh   | stu_xm | xb_id | xy_id | stu_bj | +----+----------+--------+-------+-------+--------+ |  1 | 07150101 | 小明   |     1