sql >> Base de Datos >  >> RDS >> Mysql

MySQL consulta lenta usando filesort

La consulta a continuación eliminará el Uso temporal; Uso de clasificación de archivos. de la explicación, así que esto debería funcionar mejor en thoery..

El optimizador de MySQL es tonto, por lo que el truco es forzar el optimizador que desee y esa es una tabla derivada basada en college.college_location =1. Entonces puede INNER JOIN el resultado con la tabla de estudiantes. Y de esta manera MySQL puede usar la clave de ordenación

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 el nuevo índice en mayúsculas

Ver demostración http://sqlfiddle.com/#!2/05c8a/1

O puede usar esto si cree que tiene más sentido o es más fácil de leer. El rendimiento debería ser el mismo porque la explicación me explicó que es lo mismo.

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

ver demostración http://sqlfiddle.com/#!2/05c8a/23

Nueva estrategia divide y vencerás método Realice más consultas a la base de datos, lo que hará uso de los índices correctos. Y elimine la necesidad de una tabla temporal y clasificación de archivos.

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
;

ver demostración http://sqlfiddle.com/#!2/454b3/61