簡體   English   中英

需要幫助加速此查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM