A consulta abaixo irá remover Using temporário; Usando a classificação de arquivos. da explicação, então isso deve funcionar melhor em teoria ..
O otimizador MySQL é burro, então o truque é forçar o otimizador que você deseja e essa é uma tabela derivada baseada em college.college_location =1.Então você pode INNER JOIN o resultado com a tabela do aluno.E desta forma o MySQL pode usar a chave de classificação
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
Observe o novo índice em maiúsculas
Veja a demonstração http://sqlfiddle.com/#!2/05c8a/1
Ou você pode usar isso se achar que faz mais sentido ou é mais fácil de ler. O desempenho deve ser o mesmo porque a explicação me explicou que é o mesmo.
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
veja a demonstração http://sqlfiddle.com/#!2/05c8a/23
Novo método de divisão e conquista de estratégia Dispare mais consultas ao banco de dados que farão uso de índices corretos. E remova a necessidade de uma tabela temporária e de classificação de arquivos.
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
;
veja a demonstração http://sqlfiddle.com/#!2/454b3/61