代码之家  ›  专栏  ›  技术社区  ›  Juan

如何优化mysql子查询?

  •  0
  • Juan  · 技术社区  · 7 年前

    需要帮助优化我的查询,目前它运行大约22秒,该表中有110万行。这是我的问题。此查询正在返回用户的最近时间。

    SELECT 
        t.id, t.user_id, t.created
    FROM
        timesheets t
    WHERE
        t.user_id IN (41649 , 41901,41899,41482,41648,41897,41652,
            41483,41900,41143,41907,16,42191,42195,42194,42136,42193,42190,42484,42485,42486,42504,
            42052,42797,42997,42868,42847,42505,42964)
        AND t.id = (SELECT 
                        MAX(sub_t.id)
                    FROM
                        timesheets AS sub_t
                    WHERE
                        sub_t.user_id = t.user_id
                    AND sub_t.description = 'in')
    

    我还有这个表的表索引(id,user_id,created,description)。任何建议都非常感谢。谢谢

    1 回复  |  直到 7 年前
        1
  •  1
  •   Barmar    7 年前

    多列索引 (user_id, id) 可能会有帮助。

    另外,也可以使用join而不是相关的子查询。

    SELECT 
        t.id, t.user_id, t.created
    FROM
        timesheets t
    JOIN (
        SELECT MAX(id) AS maxid
        FROM timesheets t
        WHERE user_id IN (41649 , 41901,41899,41482,41648,41897,41652,
                41483,41900,41143,41907,16,42191,42195,42194,42136,42193,42190,42484,42485,42486,42504,
                42052,42797,42997,42868,42847,42505,42964)
            AND description = "in"
        GROUP BY user_id) t1 
    ON t.id = t1.maxid
    

    我假设 id 是表的主键,因此它是唯一索引。