簡體   English   中英

MySQL 慢子查詢,我應該使用JOIN嗎?

[英]MySQL slow subquery, should I use 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
描述索引 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM