De onderstaande query zal het gebruik van tijdelijk verwijderen; Filesort gebruiken. uit de uitleg dus dit zou beter moeten lopen in thoery..
MySQL-optimizer is dom, dus de truc is om de optimizer te forceren die je wilt en dat is een afgeleide tabel op basis van college.college_location =1.Dus je kunt INNER JOIN het resultaat met de studententabel. En op deze manier kan MySQL de sorteersleutel gebruiken
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
Let op de nieuwe index in caps lock
Zie demo http://sqlfiddle.com/#!2/05c8a/1
Of je kunt dit gebruiken als je denkt dat het logischer is of gemakkelijker te lezen is. De uitvoering zou hetzelfde moeten zijn omdat de uitleg me uitlegde dat het hetzelfde is.
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
zie demo http://sqlfiddle.com/#!2/05c8a/23
Nieuwe strategie verdeel en heers methode Vuur meer query's naar de database af, waardoor de juiste indexen worden gebruikt. En verwijder de noodzaak voor een tijdelijke tabel en bestandssortering.
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
;
zie demo http://sqlfiddle.com/#!2/454b3/61