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

MySQL langsom forespørgsel ved hjælp af filsortering

Forespørgsel nedenfor vil fjerne Brug af midlertidig; Bruger filsortering. fra forklaringen, så dette burde køre bedre i thoery..

MySQL optimizer er dum, så tricket er at tvinge den optimizer, du vil have, og det er en afledt tabel baseret på college.college_location =1. Så du kan INNER JOIN resultatet med elevtabellen. Og på denne måde kan MySQL bruge sorteringsnøglen

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

Bemærk det nye indeks i caps lock

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

Eller du kan bruge dette, hvis du synes, det giver mere mening eller er lettere at læse. Forestillingen skulle være den samme, fordi forklaringen forklarede mig, at den er den samme.

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

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

Ny strategi adskille og erobre metode Send flere forespørgsler til databasen, hvad der vil gøre brug af korrekte indekser. Og fjern behovet for en midlertidig tabel og filsortering.

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
;

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



  1. Hvordan stopper man tjenester på Travis CI, der kører som standard?

  2. mysql opdeler søgestrengen efter mellemrum og skub ind i forespørgslen

  3. SQL-forespørgsel til at matche en kommasepareret streng med en kommasepareret streng?

  4. Gennemsnitlig lagerhistoriktabel