我有一个程序可以扫描服务器上在线的用户,并且找到的每个用户都会在表中插入一个新行。此扫描每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代表当前的在线用户,并且是今天到目前为止看到的用户总数的红色:
为了澄清,在17:00时,2个用户断开连接,然后15分钟后,2个新用户自午夜以来第一次连接到服务器。您可以看到红线如何从7到9代表这一点。同样,新用户今天也是第一次在23:00连接。
答案 0 :(得分:3)
由于我没有看到和索引定义,我认为它不存在。 您需要做的是在正在运行的查询上添加索引:
请注意,这很可能会导致插入/更新速度变慢。