0

このクエリを見てください:

SELECT
    (SELECT COUNT(id) FROM result WHERE `mterm1` > r.mterm1 AND lesson_id = r.lesson_id) + 1 AS `pos_mt1_school`,
    (SELECT COUNT(id) FROM result WHERE `mterm1` > r.mterm1 AND lesson_id = r.lesson_id AND class_id = r.class_id) + 1 AS `pos_mt1_class`,

    (SELECT COUNT(id) FROM result WHERE `term1` > r.term1 AND lesson_id = r.lesson_id) + 1 AS `pos_t1_school`,
    (SELECT COUNT(id) FROM result WHERE `term1` > r.term1 AND lesson_id = r.lesson_id AND class_id = r.class_id) + 1 AS `pos_t1_class`,

    (SELECT COUNT(id) FROM result WHERE `mterm2` > r.mterm2 AND lesson_id = r.lesson_id) + 1 AS `pos_mt2_school`,
    (SELECT COUNT(id) FROM result WHERE `mterm2` > r.mterm2 AND lesson_id = r.lesson_id AND class_id = r.class_id) + 1 AS `pos_mt2_class`,

    (SELECT COUNT(id) FROM result WHERE `term2` > r.term2 AND lesson_id = r.lesson_id) + 1 AS `pos_t2_school`,
    (SELECT COUNT(id) FROM result WHERE `term2` > r.term2 AND lesson_id = r.lesson_id AND class_id = r.class_id) + 1 AS `pos_t2_class`,

    r.*, student.* FROM result r

LEFT JOIN lessons lesson ON r.lesson_id = lesson.id
LEFT JOIN students student ON r.student_id = student.id
LEFT JOIN classes class ON student.class_id = class.id

WHERE student.id = 217 ORDER BY lesson.id ASC

学生の試験の点数を表示したい。したがって、最初にテーブルから彼の結果(試験のスコア)を選択しresult、次に参加lessonsしてレッスン名を表示し、最後に彼のクラスと学校の各レッスンでの生徒の位置を計算します。(彼の試験のスコアに基づく)

このクエリは正常に機能しますが、実行には約2秒かかります。(パフォーマンスの問題)

そのクエリの最適化はありますか?(およびその副選択クエリの代替)

4

1 に答える 1

0

副選択で累積カウントを行っています。

MySQLでこれを1つのクエリで行う別の方法を簡単に考えることはできません。">"が"="の場合、これは結合に変わる可能性があります。しかし、この場合、それは不可能です。

次のようなクエリを使用して、これを集計による明示的な相互結合に変えることができます。

SELECT sum(case when r2.mterm1  > r.mterm1 then 1 else 0 end)+1 as `pos_mt1_school`,
       sum(case when r2.mterm1 > r.mterm1 and r2.class_id = r.class_id) + 1 then 1 else 0 end) AS `pos_mt1_class`,
       . . .
    r.*, student.*
FROM result r LEFT JOIN
     lessons lesson
     ON r.lesson_id = lesson.id LEFT JOIN
     students student
     ON r.student_id = student.id LEFT JOIN
     classes class
     ON student.class_id = class.id join
     result r2
     on r.lesson_id = r2.lesson_id
WHERE student.id = 217
group by r.result_id
ORDER BY lesson.id ASC

これが元のバージョンよりも高速になるかどうかはわかりません。ちなみに、元のバージョンは、result(lesson_id、term2)とresult(less_id、class_id、term2)の2つのインデックスを付けることで高速化されます。

于 2013-01-31T01:22:27.347 に答える