我有两个表,名为login_log,记录了每个登录到网站的电子邮件的时间戳。另一个表称为admin并包含管理权限。两者都将电子邮件作为唯一标识符。Mysql查询优化,使用连接删除'NOT IN(SELECT CLAUSE)'
我想获得过去90天内未登录的所有电子邮件的列表。问题在于login_log表只记录每个使用时间戳记登录的电子邮件,它不会将最近的日志存储在用户登录的时间列表中。因此,我可以轻松地获取要保留的用户列表并使用我不想保留的'NOT'关键字。但它使用'NOT IN'语法非常慢。因此,下面的语句有一个子查询,它抓取了我想保留的最近90天内的所有电子邮件,外部抓取了我不想要的所有电子邮件。
SELECT distinct a.email FROM admin a WHERE a.email NOT IN (
SELECT distinct a.email FROM admin a
INNER JOIN login_log ll ON a.email = ll.email AND
(ll.timestamp > UNIX_TIMESTAMP() - 7776000) /* 90 days in seconds */
);
所以我的问题是什么将是一个很好的方法改变成一个JOIN或其他优化查询?
是a.email索引列?有什么能阻止你简单地在某处添加last_login表? – lunixbochs
'管理员'表可以包含具有相同电子邮件地址的多行吗? (我注意到你在上面使用了DISTINCT)。 – Femi
@Femi是的,它可能会。有多个站点使用相同的表(使用字段merchant_id来区分),login_log表不是特定于站点的,但仍会有重复的电子邮件,因为每个登录都被记录下来。 – Aglystas