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