gpt4 book ai didi

mysql GROUP BY 太慢了。有什么帮助让它更快吗?

转载 作者:行者123 更新时间:2023-11-29 02:38:39 25 4
gpt4 key购买 nike

所以我有一个 JS 脚本,人们将其嵌入到他们的网站中,它跟踪所有 URL 和访问者的点击。每个访问者都会获得对他们来说具有独特值(value)的“ token ”,用于跟踪他们在网站上的行为。

我想向所有者展示其访问者的网站操作,因此我编写了以下查询。所有访问都存储在“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); 来计算结果。除了缓存还有什么方法可以快速统计所有结果吗?

我阅读了一些关于索引列的内容,所以我创建了 token 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)

关于mysql GROUP BY 太慢了。有什么帮助让它更快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58513516/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com