我有 2 个表:1)存储用户凭据的用户。它拥有超过 1000 条用户记录。
身份证 | 姓名 | 密码 | 用户类型ID
2) 捕获登录详细信息的 user_logs。它相当大,即超过100000条记录。
身份证 | 姓名 | 登录日期 | 用户名 | 登录类型
我必须找到在两个给定日期和他们上次登录日期之间不访问系统的用户。
SELECT MAX(userlogs.dateoflogin) AS lastlogindate,
u1.id AS Id,
u1.name AS Name
FROM USER u1
LEFT OUTER JOIN user_logs userlogs ON u1.id = userlogs.userid
WHERE u1.id NOT IN
( SELECT userid
FROM user_logs userlogs2
WHERE userlogs2.logtype='Login'
AND userlogs2.dateoflogin BETWEEN '2013-05-10' AND '2013-05-20'
AND userlogs2.userid IS NOT NULL)
GROUP BY u1.id;
如果表包含较小的记录,那么它工作得很好。但是在用户表有超过 1000 条记录和 user_logs 表有超过 100000 条记录的实时系统中,查询花费了很长时间,我不知道它是否成功。:)
如何优化上述查询。此查询还查找从未尝试登录的用户。