[英]MySQL slow subquery, should I use JOIN?
我正在跟蹤網站上發生的用戶事件(登錄、注銷、頁面加載等)。
我想運行一個查詢,讓用戶:
在下面的示例中,我創建了一些數據,這些數據應該只返回一個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 |
描述索引 | BTREE | 錯誤的 | 描述 |
user_desc_created_index | BTREE | 錯誤的 | user_id,描述,created_at |
user_id_description_index | BTREE | 錯誤的 | 用戶 ID,描述 |
我想我可能需要一個連接而不是子查詢,但我不確定具體如何。 有人可以幫忙嗎?
您可以嘗試將 joi 與 subqiery 一起用於 user_id 的最大日期組
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.