繁体   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