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