2017-01-09 8 views
0

このクエリはサブクエリでゆっくりと実行されています。私はまだテンポラリテーブルを作るためのアクセス権を持っていませんが、このクエリをさらに最適化するためにとにかく存在しますか、どこかで壊れたロジックを使用していますか?クエリがサブクエリでゆっくり実行されています

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'; 
+0

whereで使用しているすべてのフィールドにインデックスを作成してみてください。 'lastlogin'、' id'、 'firstaccess'、' lastaccess' – jaym

+0

サブクエリに 'AND u2.id = u.id'を追加してください。それは巨大なスピードブーストではないかもしれませんが、結果はより正確になります。 – CptMisery

答えて

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'; 
関連する問題