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

提高子查询sql语句(mysql)的速度,mysql,database,performance,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

是否可以提高此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秒才能完成并减慢我的应用程序速度,我能做些什么来提高效率?我想左键连接同一个表本身,而不是使用子查询,但我无法理解语法。任何帮助都将不胜感激。谢谢

你应该看看你的索引。可能缺少:
用户id、类别、应用程序
。 因为两个查询都只返回一条记录,所以应该非常快

基本上,索引在几个字段上创建一个预先排序的引用表,这有助于DB在筛选或排序时查找记录。当您不使用它们时,该数据库正在运行,这就是为什么查询需要花费大量时间的原因

以下是MySQL索引的官方文档: 更好的是

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

开头的索引的查询工作,谢谢。你能简单地解释一下添加索引的作用或提供一个有用的链接吗?这一变化使你的问题缺少一个答案。请不要删除您的代码。谢谢。有不同类型的子查询;我认为这不是一个骗局。(因此我决定重新开放)