对于一个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执行速度应该不会太慢了。
如果还是感觉不行,那就只能分段操作了。
备注:http://bbs3.chinaunix.net/thread-1453362-1-1.html
觉得文章有用?立即:
和朋友一起 共学习 共进步!
Pingback: MYSQL删除上亿条的大量数据的具体实现 – x