提高子查询sql语句的速度(mysql)

时间:2017-06-26 13:28:26

标签: mysql database performance

是否可以提高此sql语句的速度?

SELECT 
    (SELECT 
            time
        FROM
            log
        WHERE
            user_id = 'name'
                AND category = 'Login'
        ORDER BY time DESC
        LIMIT 1 , 1) AS login_time,
    (SELECT 
            time
        FROM
            log
        WHERE
            user_id = 'name'
                AND category = 'Logout'
                AND app = 'RES'
        ORDER BY time DESC
        LIMIT 1) AS res_logout_timea

它目前需要10-16秒才能完成并减慢我的应用程序,我可以做些什么来提高效率?我在考虑左边加入同一个表而不是使用子查询,但是我无法理解语法。任何帮助,将不胜感激。感谢

2 个答案:

答案 0 :(得分:0)

您应该查看索引。可能遗漏:user_id, category, app。 由于两个查询都只返回一条记录,因此它应该非常快。

基本上,索引会创建一个在多个字段上预先排序的引用表,这有助于DB在您过滤或排序时查找记录。当您不使用它们时,该数据库正在动态执行,这就是您查询花费大量时间的原因。

这是MySQL的索引官方文档: MySQL Indexes documentation

答案 1 :(得分:0)

更好的是

INDEX(user_id, category, time)       -- for the 1st subquery
INDEX(user_id, category, app, time)  -- for the 2nd subquery 

time列必须是最后一个;其他列的顺序无关紧要。例如,您可能有这两个

INDEX(user_id, category, time)       -- for the 1st subquery
INDEX(app, user_id, category, time)  -- for the 2nd subquery 

从而帮助需要以app开头的索引的其他查询。