Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Consulta lenta do MySQL usando filesort


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