我有 MySQL MyISAM 表:
同 table 好友(id, friend_id):
1, 5
5, 1
2, 6
6, 2
3、7
如何删除反向记录?如果记录值 «1, 5» 存在值为 «5, 1» 的记录,我需要删除 «5, 1»。
感谢您的帮助!
最佳答案
DELETE F1
FROM friends F1, friends F2
WHERE F1.friend_id = F2.id
AND F2.friend_id = F1.id
AND F1.id > F1.friend_id
编辑
更好的语法是:
DELETE F1
FROM friends F1
JOIN friends F2 ON F1.friend_id = F2.id AND F2.friend_id = F1.id
WHERE F1.id > F1.friend_id
但是执行时间是一样的。
另外,我创建了 this small script用于快速和肮脏的基准测试。
结果:
没有索引:
Dalen: 600 => 400 rows. Time: 0.0274 Mark: 600 => 400 rows. Time: 0.4323 Frosty: 600 => 400 rows. Time: 0.4081 Nick: 600 => 400 rows. Time: 0.3201
id
和 friend_id
列的单独索引:
Dalen: 600 => 400 rows. Time: 0.0201 Mark: 600 => 400 rows. Time: 0.0095 Frosty: 600 => 400 rows. Time: 0.0059 Nick: 600 => 400 rows. Time: 0.3257
(id, friend_id)
的唯一索引:
Dalen: 600 => 400 rows. Time: 0.0168 Mark: 600 => 400 rows. Time: 0.0057 Frosty: 600 => 400 rows. Time: 0.0041 Nick: 600 => 400 rows. Time: 0.3209
结论:
- Dalen:当列没有索引时最快
- Frosty:当列被索引时最快(Mark's being close,在不考虑 tmp 表创建时间的情况下甚至更快。但是,当字段被索引时,创建 tmp 表所需的额外时间会增加)<
关于php - MySQL删除重复的反向值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5438764/