我有两个表: sessions 和 session_states 。第一个表包含有关会话的一些常规信息。
第二个表包含每个会话的状态历史记录;多个行可以连接到同一会话(列 session_id );带有最新 timestamp 的行表示给定会话的当前/实际状态。
会话
id search_criteria some_other_info
1 aaa something
2 bbb something
3 aaa something
会话状态
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的右侧,我们遍历了每一行。
有什么方法可以更有效地做到这一点?
P.S。我只能使用MySQL 5.6 / 5.7。