[英]Need help Speeding up this Query
我有一個程序,它掃描服務器上在線的用戶,並為找到的每個用戶在表中插入一個新行。 此掃描每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第一次連接。
由於我沒有看到和索引定義我會假設它不存在。 您需要做的是在正在運行的查詢上添加索引:
請注意,這很可能會導致插入/更新速度變慢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.