mysql 删除两个同结构表,两个相同列数据.
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 删除两个同结构表,两个相同列数据.相关的知识,希望对你有一定的参考价值。
msyql 两个表结构相同:
A表:mobid,itemid,min,max
22222,333333,100,100
33333,444444,100,100
44444,555555,100,100
55555,666666,100,100
B表:mobid,itemid,min,max
22222,333333,111,111
33333,444444,111,111
44444,555555,111,111
55555,666666,111,111
77777,888888,111,111
现在希望能删除,表B中,已存在于表A的:mobid 和 itemid相同的数据
也就是相当要删除掉
B表:
22222,333333,111,111
33333,444444,111,111
44444,555555,111,111
55555,666666,111,111
的这些数据。
如果用O(n^2)的更新是肯定超时的。
计算次数是20W*20W*字符长度
我给你提个O(n)的思路,不过要用程序实现,SQL没机会。HQL或许有,但是不会。
首先是把A,B表中的都读到内存。
然后做哈希,开个10^10布尔类型的数组,1G内存多点,2G肯定够用。
然后做A表的哈希,
做好后遍历B表,做哈希。重复的做标记。
完成一轮后使用令一套保证跟第一次哈希不重复的哈希算法再遍历一次标记过的B表,
再遍历A表。
如此只需分别遍历两次AB表,即可完成查重。
然后把B表中重复的删掉即可。
计算机的执行效率大约是每秒10000*10000次。
如果把AB表中的string型主键转成int型存储,然后再做比对。
大约是20W*20W*2的比对次数,那么800秒,就是20到40分钟。
都应该可以比对完,但是如果是如题描述的12位字符。就需要几个小时甚至几天了。
再说一种O(Nlog2N)的算法。
首先是对A,B进行合并,然后做快排序。
然后遍历一次进行顺序查重。
这种方法用的内存比较少,计算量是40W*100,基本上10秒内都能出结果。本回答被提问者采纳 参考技术B delete from B where exists(select 1 from A where A.mobid=B.mobid and A.itemid=B.itemid) 参考技术C 我有两个表,这两个表的结构是完全相同的。 我现在想从这两个表中随机SELECT ming FROM male WHERE num = 1 union (SELECT ming FROM female 参考技术D DELETE B FROM A,B WHERE A.mobid=B.mobid and A.itemid=B.itemid 第5个回答 2011-06-15 DELETE B FROM A,B WHERE A.mobid=B.mobid and A.itemid=B.itemid追问
谢谢,这样是可以,可数据库分别 20W条,好像太大,执行太久了!!
以上是关于mysql 删除两个同结构表,两个相同列数据.的主要内容,如果未能解决你的问题,请参考以下文章