|
有表relation(id, aid, bid) 其中id为自增的id字段,主键。
现要加一个(aid, bid)的唯一索引,那首先要去掉aid和bid重复的记录,过去我是这样做的:
delete r1 from relation r1, relation r2 where r1.id>r2.id and r1.aid=r2.aid and r1.bid=r2.bid
由于需要自连接,会见临时表,当relation表极大时,实际超过百万,速度就已经无法接受了,
上周五晚上,灵感一来,突然想到了一个办法,试验下来果然比原来快:
create table relation_new like relation;
alter table relation_new add unique key(aid, bid);
insert into relation_new select * from relation on duplicate key id=id;
然后再把表名改为原来的releation即可,还等于做了一遍optimize。
其实,原理就是忽略重复的key。
当时觉得无比激动,可是后来想想,都忽略了干嘛还要update id=id?mysql的insert不是有ignore关键字吗?
insert ignore into relation select * from relation
这样不就都解决了吗?鄙视自己一下自己的记性,怎么老忘记ignore关键字。
---------------------------------------------------------------------------------------
后记:刚刚google了一下,其实还有更简单的方法:
SELECT * INTO OUTFILE '/tmp/user.txt' FROM `user`;
LOAD DATA INFILE '/tmp/user.txt' REPLACE INTO TABLE `user`;
replace还能改为ignore
这个方法我在mysql 4.0下用过,但是会有很麻烦的乱码以及引号问题,4.1和5.x不知道有没有改善。。。 |
|