免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 10040 | 回复: 14

mysql关联删除记录问题 [复制链接]

论坛徽章:
0
发表于 2009-05-14 00:18 |显示全部楼层
有俩个表table1 , table2

talbe1   有俩个字段id,pid     有2千万条记录         同一pid对应多个id
table2   有一个字段pid         有100万条记录        pid唯一

想要删除表table1中记录,条件是table1.pid=table2.pid

大家给推荐一个效率高一点的方法,用delete表关联删除效率不是很高,感觉有点慢

[ 本帖最后由 steel_lei 于 2009-5-14 00:23 编辑 ]

论坛徽章:
0
发表于 2009-05-14 09:29 |显示全部楼层
我想到的是select建新表,但是好像也快不了多少

CREATE TABLE tmp AS  SELECT  * FROM table1  WHERE pid NOT IN (SELECT pid FROM table2)

论坛徽章:
0
发表于 2009-05-14 09:43 |显示全部楼层
原帖由 ws00377531 于 2009-5-14 09:29 发表
我想到的是select建新表,但是好像也快不了多少

CREATE TABLE tmp AS  SELECT  * FROM table1  WHERE pid NOT IN (SELECT pid FROM table2)


我在测试创建表,看一下create的效率,但后面没用not in,用not in会很慢的,用表关联会好很多

论坛徽章:
1
白银圣斗士
日期:2015-11-23 08:33:04
发表于 2009-05-14 09:52 |显示全部楼层
not in 更慢的了,关连要快。看索引了。

论坛徽章:
0
发表于 2009-05-14 09:55 |显示全部楼层
改用left join吧
SELECT  * FROM table1 a left join table2 b on (a.pid=b.pid) where b.pid is null

论坛徽章:
1
白银圣斗士
日期:2015-11-23 08:33:04
发表于 2009-05-14 10:14 |显示全部楼层
原帖由 voxxu 于 2009-5-14 09:55 发表
改用left join吧
SELECT  * FROM table1 a left join table2 b on (a.pid=b.pid) where b.pid is null

这个好。

论坛徽章:
0
发表于 2009-05-14 10:16 |显示全部楼层
对于一个2000W的大表,一次走一个全表扫描确是很困难的。不过对于100W的表走一个全描扫也困难。

如果做这件事情又不想影响太大,就要分步来完成。

我给你一个思路你来参考一下。
首先衡量删除操作有多大。
selet count(*) from table1 a ,table2 b where a.pid=b.pid;
如果都有索引的话,这个操作还是挺快的。
如果操作的操作大于原表的40%,那么很有必要重建这个表了。

重建表的方法:就是按条件提取数据到一个新表,最后改名完成。这是一种方案。

另一种 删除方向。

上面通过比较觉的需要删除的量不是太大时,把需要删除的PID生到到另一个临时表中。
mysql DBname -e "select a.pid from table1 a ,table2 b where a.pid=b.pid">del_pid.txt;

sed -i '1d' del_pid.txt
awk '{print "delete from table1 where pid=",$1,";"}' del_pid.txt >del_pid.sql
mysql DBname<del_pid.sql

这样把SQL拆成多个SQL执行速度应该不会太慢了。

如果还是感觉不行,那就只能分段操作了。

论坛徽章:
1
白银圣斗士
日期:2015-11-23 08:33:04
发表于 2009-05-14 10:30 |显示全部楼层

回复 #7 Coolriver 的帖子

这个很好,我们经常也这样做,用perl..

不过一般我是数据库做的事情让数据库做。

论坛徽章:
0
发表于 2009-05-14 17:04 |显示全部楼层
原帖由 枫影谁用了 于 2009-5-14 10:30 发表
这个很好,我们经常也这样做,用perl..

不过一般我是数据库做的事情让数据库做。

我现在很多工作拿到数据外面做了。
数据量大了,全压到DB上,都出不了结果了。:)

论坛徽章:
9
每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00数据库技术版块每周发帖之星
日期:2016-03-07 16:30:25
发表于 2009-05-14 17:55 |显示全部楼层
原帖由 Coolriver 于 2009-5-14 10:16 发表
对于一个2000W的大表,一次走一个全表扫描确是很困难的。不过对于100W的表走一个全描扫也困难。

如果做这件事情又不想影响太大,就要分步来完成。

我给你一个思路你来参考一下。
首先衡量删除操作有多大 ...


很不错~收藏了~但是把id放到临时文件里会有效率问题吗?跟建个临时表存id,哪个好一点?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP