Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Langsame MySQL-Abfrage mit Filesort

Die folgende Abfrage entfernt Using Temporary; Dateisort verwenden. aus der Erklärung, also sollte das in der Theorie besser laufen..

Der MySQL-Optimierer ist dumm, also besteht der Trick darin, den gewünschten Optimierer zu erzwingen, und das ist eine abgeleitete Tabelle, die auf college.college_location =1 basiert. Sie können also das Ergebnis mit der Studententabelle INNER JOIN. Und auf diese Weise kann MySQL den Sortierschlüssel verwenden

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

Beachten Sie den neuen Index in Feststelltaste

Siehe Demo http://sqlfiddle.com/#!2/05c8a/1

Oder Sie können dies verwenden, wenn Sie der Meinung sind, dass es sinnvoller oder einfacher zu lesen ist. Die Leistung sollte dieselbe sein, da die Erklärung mir erklärt hat, dass es dieselbe ist.

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

siehe Demo http://sqlfiddle.com/#!2/05c8a/23

Neue Strategie „Divide and Conquer“-Methode Feuern Sie mehr Abfragen an die Datenbank ab, was von korrekten Indizes Gebrauch macht. Und beseitigen Sie die Notwendigkeit einer temporären Tabelle und Dateisortierung.

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
;

siehe Demo http://sqlfiddle.com/#!2/454b3/61