La requête ci-dessous supprimera l'utilisation temporaire ; Utilisation du tri de fichiers. de l'explication donc cela devrait mieux fonctionner en théorie..
L'optimiseur MySQL est stupide, donc l'astuce consiste à forcer l'optimiseur que vous voulez et c'est une table dérivée basée sur college.college_location =1. Vous pouvez donc INNER JOIN le résultat avec la table des étudiants. Et de cette façon MySQL peut utiliser la clé de tri
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
Notez le nouvel index en majuscules
Voir la démo http://sqlfiddle.com/#!2/05c8a/1
Ou vous pouvez l'utiliser si vous pensez que cela a plus de sens ou est plus facile à lire. La performance devrait être la même car l'explication m'a expliqué que c'est la même chose.
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
voir la démo http://sqlfiddle.com/#!2/05c8a/23
Nouvelle stratégie diviser pour mieux régner Envoyez plus de requêtes à la base de données, ce qui utilisera des index corrects. Et supprimez le besoin d'une table temporaire et d'un tri de fichiers.
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
;
voir la démo http://sqlfiddle.com/#!2/454b3/61