Mysql
 sql >> Base de données >  >> RDS >> Mysql

Requête lente MySQL utilisant filesort

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