我试图找出用户在过去24小时内的最后一个动作是在里面还是在外面(这是一个软件,用于在紧急情况下知道哪些人还在大楼里)。这个表有大约200万行,我们有大约3000个用户。
我找到的唯一解决方案是下面的一个,它的工作,但问题是它需要15秒。。。
SELECT TIME, firstname, lastname, dept
FROM DAY
WHERE event_point_id IN (20, 22, 24, 26, 28, 30)
AND id IN (SELECT MAX(id)
FROM DAY
GROUP BY pin)
GROUP BY pin
ORDER BY TIME ASC
day是一个包含以下详细信息的视图
SELECT id, pin, event_point_id, time, firstname, lastname, dept
FROM acc_monitor_log
WHERE (((TO_DAYS(NOW()) - TO_DAYS(time)) < 1) AND (pin <> '--'))
有什么办法可以加快这一进程?
3条答案
按热度按时间zvms9eto1#
首先,我将使用相关子查询并除去
GROUP BY
:然后,确保在基础表上有索引
acc_monitor_log(pin, id)
以及acc_monitor_log(event_point_id, pin, id)
.njthzxwz2#
如果我理解正确,你的
DAY
视图已经在筛选过去24小时的条目,您只需要从该视图中为每个用户获取最新的行。如果这是正确的,像这样简单的事情应该做的技巧,应该比
IN
在我看来。qybjjes13#
第一个建议是使用内部连接减少in子句
或者
确保你有合适的索引。。在列(pin,id)上,您还可以尝试添加一个适当的表,该表的值为20….30,使用索引而不是in子句或子查询,并在此表上使用联接