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