Frågan nedan kommer att ta bort Using temporary; Använder filsortering. från förklara så detta borde fungera bättre i thoery..
MySQL optimizer är dumt så tricket är att tvinga den optimizer du vill ha och det är en härledd tabell baserad på college.college_location =1. Så du kan INNER JOIN resultatet med studenttabellen. Och på detta sätt kan MySQL använda sorteringsnyckeln
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
Observera det nya indexet i caps lock
Se demo http://sqlfiddle.com/#!2/05c8a/1
Eller så kan du använda det här om du tycker att det är mer vettigt eller är lättare att läsa. Föreställningen bör vara densamma eftersom den förklarade för mig att den är densamma.
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 skilje och erövra metod Skicka fler förfrågningar till databasen, vilket kommer att använda korrekta index. Och ta bort behovet av en temporär tabell och 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