簡體   English   中英

Mysql GROUP BY 太慢。 有什么幫助讓它更快嗎?

[英]Mysql GROUP BY too slow. Any help to make it faster?

所以我有一個 JS 腳本,人們將它嵌入到他們的網站中,它會跟蹤訪問者的所有 URL 和點擊。 每個訪問者都會獲得“令牌”,這對他們來說是獨一無二的,用於跟蹤他們在網站上的行為。

我想向他們的訪問者展示網站操作的所有者,所以我寫了以下查詢。 所有訪問都存儲在“custom_logs”表中。

SELECT *
FROM custom_logs
WHERE pn = 'pn-9283896662' AND
      id IN (SELECT MAX(id)
             FROM custom_logs
             WHERE action_clicked_text LIKE '%sometext%'  
             GROUP BY token
           )
      AND token != '' AND
      action_timestamp > 11568 AND
      action_timestamp < 1570846368
 order by action_timestamp desc
 LIMIT 0, 30;

我將問題縮小到查詢的“GROUP BY token”部分。 當我刪除這部分查詢運行得更快,但仍然很慢(0.7s 與 Group By 部分的 5s 相比),並且一頁中有 4 個這樣的查詢。 在 custom_logs 表中已經有 250 000 行。

“GROUP BY token”部分之所以存在,是因為我只想向人們顯示每個用戶的一個且唯一的最新日志,以便他們可以單擊它並查看所述用戶的完整日志。 所以在查詢之后我使用mysqli_num_rows($results); 計算結果。 除了緩存還有其他方法可以快速計算所有結果嗎?

我讀了一些關於索引列的內容,所以我制作了令牌 varchar(255) 並對其進行了索引,但它在速度方面沒有任何作用。 但我在 SQL 方面也不是那么好。

我建議用相關的子查詢替換in 我在想:

SELECT cl.*
FROM custom_logs cl
WHERE cl.pn = 'pn-9283896662' AND
      cl.id = (select max(cl2.id)
               from customer_logs cl2
               where cl2.token = cl.token and
                     cl2.action_clicked_text LIKE '%sometext%'
              ) and
      cl.token <> '' AND
      cl.action_timestamp > 11568 AND
      cl.action_timestamp < 1570846368
order by cl.action_timestamp desc
limit 0, 30;

為此,我推薦以下索引:

  • customer_logs(pn, action_timestamp, token, id)
  • customer_logs(token, action_clicked_text, id)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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