mysql - 带有子查询的查询运行缓慢

标签 mysql

此查询与子查询一起运行缓慢。我还没有权限创建临时表,但是有没有办法进一步优化这个查询,或者我是否在某个地方使用了损坏的逻辑?

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
SELECT 
       CONCAT( u.firstname , ' ' , u.lastname) as Student_name,
        u.id as Student_ID,
        FROM_UNIXTIME(u.firstaccess) as first_moodle_access,
        FROM_UNIXTIME(u.lastaccess) as last_moodle_access,
        FROM_UNIXTIME(last.timeaccess) as last_course_access,
        grp.name as Cohorts,
        cour.fullname as course 
FROM 
mdl_user as u 
Inner Join mdl_user_lastaccess as last on u.id = last.userid
Inner Join mdl_course as cour on last.courseid = cour.id
Inner Join mdl_groups as grp on cour.id = grp.courseid 
WHERE u.lastlogin = (
                     Select Max(u2.lastlogin)
                     From mdl_user as u2 
                     where u2.lastlogin = u.lastlogin
                    ) 
AND cour.id = '10189' AND 
u.firstaccess > '0' AND 
u.lastaccess > '0';

最佳答案

相关子查询在大多数情况下效率相当低,您可能会通过交付的表获得更好的性能。 大多数情况下,可以使用 INNER JOIN 重写相关子查询。

我认为你的相关子查询可以重写如下,但你需要检查结果是否相同,因为我不知道你的表结构和数据。

SELECT 
       CONCAT( u.firstname , ' ' , u.lastname) as Student_name,
        u.id as Student_ID,
        FROM_UNIXTIME(u.firstaccess) as first_moodle_access,
        FROM_UNIXTIME(u.lastaccess) as last_moodle_access,
        FROM_UNIXTIME(last.timeaccess) as last_course_access,
        grp.name as Cohorts,
        cour.fullname as course 
FROM 
mdl_user as u 
Inner Join mdl_user_lastaccess as last on u.id = last.userid
Inner Join mdl_course as cour on last.courseid = cour.id
Inner Join mdl_groups as grp on cour.id = grp.courseid 
Inner Join(
  Select
    Max(lastlogin)
  FROM
    mdl_user
) AS u2
ON 
  u.lastlogin = u2.lastlogin
WHERE
cour.id = '10189' AND 
u.firstaccess > '0' AND 
u.lastaccess > '0';

关于mysql - 带有子查询的查询运行缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41552178/

相关文章:

php - laravel 5.4 中更新数据时 $request->get() 未获取表单值

sql - 为子字符串查询优化 Mysql 表索引

sql - 有没有办法将 SQL 列与 LIKE 结合起来

mysql - 使用左连接时使用 order by 和 limit 过滤查询

php - 比较时间范围并计算时间差

Mysql 使用选择查询将数据插入新列

MySQL Closure Table 分层数据库 - 如何以正确的顺序提取信息

mysql - 存储过程不存在,即使我已经创建

mysql - 局部变量语法错误

MySQL LEFT JOIN - 除非包含所有列,否则结果为空