La query seguente rimuoverà l'utilizzo temporaneo; Usando Filesort. dalla spiegazione, quindi questo dovrebbe funzionare meglio in teoria..
L'ottimizzatore MySQL è stupido, quindi il trucco è forzare l'ottimizzatore che desideri e questa è una tabella derivata basata su college.college_location =1.Quindi puoi UNIRE INNER il risultato con la tabella degli studenti.E in questo modo MySQL può usare la chiave di ordinamento
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
Nota il nuovo indice con blocco maiuscolo
Guarda la demo http://sqlfiddle.com/#!2/05c8a/1
Oppure puoi usarlo se pensi che abbia più senso o sia più facile da leggere. La performance dovrebbe essere la stessa perché la spiegazione mi ha spiegato che è la stessa.
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
vedere la demo http://sqlfiddle.com/#!2/05c8a/23
Nuova strategia divide et impera il metodo Invia più query al database che utilizzerà gli indici corretti. E rimuovi la necessità di una tabella temporanea e di un filesort.
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
;
vedere la demo http://sqlfiddle.com/#!2/454b3/61