以下のクエリは、Usingtemporaryを削除します。 filesortを使用します。説明から、これはthoeryでより良く実行されるはずです。
MySQLオプティマイザはばかげているので、必要なオプティマイザを強制するのがコツです。これは、college.college_location =1に基づく派生テーブルです。したがって、結果を学生テーブルと内部結合できます。このようにして、MySQLはソートキーを使用できます。
SELECT
*
FROM
student
INNER JOIN (
SELECT
college_id
FROM
college
WHERE
college.college_location = 1
) college
ON student.student_college = college.college_id
ORDER BY
student.countup DESC
, student.updated_time DESC
CapsLockの新しいインデックスに注意してください
デモを参照
または、より理にかなっている、または読みやすいと思われる場合は、これを使用できます。説明では同じであると説明されているため、パフォーマンスは同じである必要があります。
SELECT
*
FROM (
SELECT
college_id
FROM
college
WHERE
college.college_location = 1
)
college
INNER JOIN
student
ON
student.student_college = college.college_id
ORDER BY
student.countup DESC
, student.updated_time DESC
デモを参照
新しい戦略の分割統治法 正しいインデックスを利用するためにデータベースに対してさらにクエリを実行し、一時テーブルとファイルソートの必要性を排除します。
SET @college_ids = NULL;
SELECT
GROUP_CONCAT(college_id)
FROM
college
WHERE
college_location = 1
GROUP BY
college_location ASC
INTO @college_ids;
SELECT
*
FROM
student
WHERE
student.student_college IN(@college_ids)
ORDER BY
student.countup DESC
, student.updated_time DESC
;
デモを参照