需要帮助加速此查询

时间:2015-02-26 16:00:50

标签: mysql sql

我有一个程序可以扫描服务器上在线的用户,并且找到的每个用户都会在表中插入一个新行。此扫描每5分钟发生一次,数据用于在网站上绘制用户活动图。

这是我桌子的结构:

-------------------------------------------------------
|                   stats_table                       |
-------------------------------------------------------
| id, bigint(20) unsigned not null PRI auto_increment |
| scan_id, bigint(20) unsigned not null               |
| username, varchar(32) null                          |
| time_scanned, timestamp not null def=curr_timestamp |
-------------------------------------------------------

我想获得自午夜以来汇总的用户数,每次扫描

我设法得到了这个,但查询需要15秒才能完成:

SELECT COUNT(*) FROM (SELECT DISTINCT t.scan_id, t1.username FROM
   stats_table INNER JOIN stats_table t1 ON
   t.scan_id >= t1.scan_id WHERE
   t1.time_scanned > CONCAT(DATE(t.time_scanned), ' 00:00:00') AND
   t1.time_scanned > DATE_SUB(NOW(), INTERVAL 24 HOUR) AND
   t1.time_scanned <= NOW()
) s GROUP BY s.scan_id

所以我想知道是否有更快的方法来获得这个结果?

这是我图表上的直观表示。 Blue代表当前的在线用户,并且是今天到目前为止看到的用户总数的红色:

enter image description here

为了澄清,在17:00时,2个用户断开连接,然后15分钟后,2个新用户自午夜以来第一次连接到服务器。您可以看到红线如何从7到9代表这一点。同样,新用户今天也是第一次在23:00连接。

1 个答案:

答案 0 :(得分:3)

由于我没有看到和索引定义,我认为它不存在。 您需要做的是在正在运行的查询上添加索引:

请注意,这很可能会导致插入/更新速度变慢。