Mysql
 sql >> Database >  >> RDS >> Mysql

Query lenta MySQL utilizzando filesort

La query seguente rimuoverà l'utilizzo temporaneo; Usando Filesort. dalla spiegazione, quindi questo dovrebbe funzionare meglio in teoria..

L'ottimizzatore MySQL è stupido, quindi il trucco è forzare l'ottimizzatore che desideri e questa è una tabella derivata basata su college.college_location =1.Quindi puoi UNIRE INNER il risultato con la tabella degli studenti.E in questo modo MySQL può usare la chiave di ordinamento

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

Nota il nuovo indice con blocco maiuscolo

Guarda la demo http://sqlfiddle.com/#!2/05c8a/1

Oppure puoi usarlo se pensi che abbia più senso o sia più facile da leggere. La performance dovrebbe essere la stessa perché la spiegazione mi ha spiegato che è la stessa.

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

vedere la demo http://sqlfiddle.com/#!2/05c8a/23

Nuova strategia divide et impera il metodo Invia più query al database che utilizzerà gli indici corretti. E rimuovi la necessità di una tabella temporanea e di un filesort.

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
;

vedere la demo http://sqlfiddle.com/#!2/454b3/61