У меня есть две таблицы: сессий и сессий_states . Первая таблица содержит общую информацию о сеансе.
Вторая таблица содержит историю состояний для каждого сеанса; несколько строк могут быть подключены к одному сеансу (столбец session_id ); строка с самой последней отметкой времени представляет текущее / фактическое состояние для данного сеанса.
сеансов
id search_criteria some_other_info
1 aaa something
2 bbb something
3 aaa something
session_states
pk session_id state timestamp
1 1 new 01/01/1970 00:01
2 1 active 01/01/1970 00:02
3 2 new 01/01/1970 01:01
4 3 new 01/01/1970 02:01
Я пытаюсь создать запрос, который позволяет сортировать по столбцу search_criteria и представляет список совпадающих сеансов с их текущими состояниями. Примерно так (WHERE search_criteria = 'aaa'):
id search_criteria some_other_info state timestamp
1 aaa something active 01/01/1970 00:02
3 aaa something new 01/01/1970 02:01
Мой запрос:
SELECT s.id, s.search_criteria, s.some_other_info, st.state, st.timestamp
FROM sessions s
JOIN
(SELECT session_id, state, MAX(timestamp) FROM session_states GROUP BY session_id DESC) st
ON s.id = st.session_id
WHERE search_criteria = 'aaa';
Когда в каждой таблице 400k + строк, выполнение запроса занимает более 1 секунды. Анализатор запросов говорит, что в правой части JOIN мы пропускаем oop через каждую строку.
Любой способ сделать это более эффективным способом?
PS Я могу использовать только MySQL 5,6 / 5,7.