我有这个 SQL 查询,它每 5 秒查询一次数据库以确定当前正在使用该软件的用户。活跃用户在过去 10 秒内对服务器进行了 ping 操作。 (该表根据用户 Activity 正确更新,并且我有一个线程逐出 session 超时条目,一切正常)。
我正在寻找一种更有效/更快捷的方法来执行此操作,因为它会被频繁调用,大约每 5 秒调用一次。此外,数据库中最多可能有 500 个用户。语言是 Java,但问题确实与任何语言有关。
List<String> r = new ArrayList<String>();
Calendar c = Calendar.getInstance();
long threshold = c.get(Calendar.SECOND) + c.get(Calendar.MINUTE)*60 + c.get(Calendar.HOUR_OF_DAY)*60*60 - 10;
String tmpSql = "SELECT user_name, EXTRACT(HOUR FROM last_access_ts) as hour, EXTRACT(MINUTE FROM last_access_ts) as minute, EXTRACT(SECOND FROM last_access_ts) as second FROM user_sessions";
DBResult rs = DB.select(tmpSql);
for (int i=0; i<rs.size(); i++)
{
Map<String, Object> result = rs.get(i);
long hour = (Long)result.get("hour");
long minute = (Long)result.get("minute");
long second = (Long)result.get("second");
if (hour*60*60 + minute*60 + second > threshold)
r.add(result.get("user_name").toString());
}
return r;
最佳答案
如果你想让它运行得更快,那么在 user_sessions(last_access_ts, user_name)
上创建一个索引,并在查询中执行日期逻辑:
select user_name
from user_sessions
where last_access_ts >= now() - 5/(24*60*60);
这确实有一个缺点。您可能经常更新 last_access_ts
字段。该字段的索引也必须更新。从积极的一面来说,这是一个覆盖索引,因此索引本身可以满足查询而不需要借助原始数据页。
关于java - 执行此 SQL 查询的更有效方法?时间比较查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18489421/