MySQL慢子查询,我应该使用JOIN吗?

约翰·卡特

我正在跟踪网站上发生的用户事件(登录,注销,页面加载等)。

我想运行一个查询,以使用户:

  • 已登录
  • 还没有注销
  • 超过90分钟前未登录

在下面的示例中,我创建了一些数据,这些数据应仅返回一个带有的登录用户user_id = 3,因为

  • user_id 1 已经登出
  • user_id 2 时间到
  • user_id 3 登录并且尚未超时或手动注销

假设现在的时间是2021-02-24 12:15:00

ID 用户身份 描述 created_at
19954 3 登录 2021-02-24 12:00:00
16085 1个 登出 2021-02-24 12:00:00
11844 2 登录 2021-02-24 10:00:00
16850 1个 登录 2021-02-24 10:00:00

我当前的查询是这样,但运行速度非常慢。

SELECT DISTINCT(user_id), id, created_at
FROM events e1
WHERE id = (
            SELECT id
            FROM events e2
            WHERE e2.user_id = e1.user_id
            AND description IN ('log in', 'log out')
            ORDER BY created_at desc
            LIMIT 1
           )
AND description = 'log in'
AND created_at > NOW() - INTERVAL 90 MINUTE
ORDER BY created_at desc

我的索引如下。

基本的 BTREE 真的 ID
description_index BTREE 错误的 描述
user_desc_created_index BTREE 错误的 user_id,说明,创建时间
user_id_description_index BTREE 错误的 user_id,说明

我想我可能需要一个联接而不是子查询,但是我不确定具体如何。有人可以帮忙吗?

scaisEdge

您可以尝试通过user_id将joi和subqiery一起用于最大日期组

SELECT DISTINCT user_id , id, created_at
FROM events e1 
INNER JOIN (
       select user_id, max(created_at) max_date
       from events 
       WHERE  description IN ('log in', 'log out')
       group by user_id 
) t1 
inner join events  t2 ON t1.user_id = t2.user_id and  t1.max_date = t2.created_at
WHERE t2-description = 'log in'
AND t2.created_at > NOW() - INTERVAL 90 MINUTE
ORDER BY t2.created_at desc

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我应该对多对多关系使用子查询吗?

来自分类Dev

使用OR子句的MySQL JOIN查询非常慢

来自分类Dev

使用OR子句的MySQL JOIN查询非常慢

来自分类Dev

MySQL子查询非常慢

来自分类Dev

即使使用INNER JOIN而不是IN,MySQL查询也非常慢

来自分类Dev

MySQL中使用GROUP BY的子查询非常慢

来自分类Dev

我应该使用单独的mysql表吗

来自分类Dev

我应该使用单独的mysql表吗

来自分类Dev

MySQL更新查询在子查询中慢

来自分类Dev

MySQL子查询JOIN

来自分类Dev

Mysql JOIN子查询

来自分类Dev

Join子查询中的计数和总和-我可以使用ActiveRecord建立此sql查询吗?

来自分类Dev

我如何使用Join而不是子查询进行后续查询?

来自分类Dev

我应该避免在查询大表时使用ORDER BY吗?

来自分类Dev

我应该为此使用多个PostgreSQL查询吗?

来自分类Dev

MySQL慢查询-使用Filesort

来自分类Dev

MySQL非常慢的子查询优化

来自分类Dev

MySQL left join withexists子查询返回的行数比它应该的多

来自分类Dev

PostgreSQL-LEFT JOIN LATERAL比子查询慢

来自分类Dev

使用 HAVING 子句进行慢查询 - 我可以加快速度吗?

来自分类Dev

MySQL子查询比2个独立查询慢

来自分类Dev

MySQL - 在 join 和 from 上使用子查询

来自分类Dev

使用SELECT子查询的UPDATE在MySQL 5.7上运行非常慢(但在5.5上很好)

来自分类Dev

我应该使用参考吗?

来自分类Dev

我应该使用LightOpenID吗?

来自分类Dev

我应该使用Lua吗?

来自分类Dev

我应该使用Sqlite吗

来自分类Dev

我应该使用webview吗?

来自分类Dev

我应该使用继承吗?