У меня есть 2 таблицы: 1) пользователь, в котором хранятся учетные данные пользователей. Он содержит более 1000 записей пользователей.SQL-запрос для выбора из двух довольно больших таблиц
ID | ИМЯ | ПАРОЛЬ | USERTYPEID
2) user_logs, в которых фиксируются данные для входа. Его довольно большой, то есть более 100000 записей.
ID | ИМЯ | DATEOFLOGIN | USERID | LOGINTYPE
Я должен найти пользователей, которые не имеют доступа к системе между двумя заданными датами и их последней зарегистрированной датой.
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 записей, запрос занял очень много времени, и я не знаю, как это удалось или нет. :)
Как оптимизировать вышеуказанный запрос. Этот запрос также находит пользователя, который никогда не пытается войти в систему.
У вас есть индекс в 'dateoflogin'? – Barmar
да его проиндексирован на dateoflogin и userid – pinkb