java - 执行此 SQL 查询的更有效方法?时间比较查询?

标签 java mysql sql

我有这个 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/

相关文章:

java - 如何将字符串从 JTextField 转换为 double 组

php - 使用 PDO 将整数从 64 位转换为 32 位

c# - 带有实例参数的 SQL 连接字符串

java - DynamoDB 如何查询强一致性的非键属性?

java - Set<> 为相同的值赋予不同的对象

php - PROPEL - 将 sql 查询传输到 propel

php - 从 MySQL 获取多行输出

mysql - 如何用group by找到属性值最大的行?

mysql - INSERT INTO MySQL 语句失败

java - 带有多个复选框的对话框android源代码