我有一个简单的MySQL表格,像这样:
CREATE TABLE `logins` (
`user` int(10) NOT NULL,
`time` int(10) NOT NULL,
`ip` varchar(20) NOT NULL,
PRIMARY KEY (`user`,`time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
使用CRON,我每24小时根据以下方式清理此表,只保留每个用户IP的唯一登录,即如果某个用户从IP X登录5次,则仅保留他使用该IP登陆的最新时间,并删除其他4个登陆记录。
这是我的查询语句:
DELETE FROM `logins` WHERE (`user`, `time`) NOT IN(
SELECT `user`, `maxtime`
FROM(
SELECT `user`, MAX(`time`) as `maxtime` FROM `logins` GROUP BY `user`, `ip`
) as `a`
)
这种查询-子查询的方式有点慢。完成需要大约3秒钟。
然而,内部部分非常快。如果我省略SELECT部分,像这样:
SELECT `user`, MAX(`time`) as `maxtime` FROM `logins` GROUP BY `user`, `ip`
这只需要不到0.005秒。
所以我在想:如果我相反地做呢? 不是“删除除X以外的所有内容”,而是“选择X,删除所有内容,重新插入X”?
这种操作可行吗?
类似于以下内容:
1) SELECT `user`, MAX(`time`) as `maxtime` FROM `logins` GROUP BY `user`, `ip`
/* store this somewhere temporarily */
2) TRUNCATE TABLE `logins`
3) reinsert data from step 1 to `logins`