Dotaz níže odstraní Using dočasné; Pomocí řazení souborů. z vysvětlení, takže by to mělo fungovat lépe v thoery..
Optimalizátor MySQL je hloupý, takže trik je vnutit optimalizátor, který chcete, a to je odvozená tabulka založená na college.college_location =1. Takže můžete VNITŘNÍ PŘIPOJIT výsledek se studentskou tabulkou. A tímto způsobem může MySQL používat třídicí klíč
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
Všimněte si nového indexu v caps lock
Podívejte se na ukázku http://sqlfiddle.com/#!2/05c8a/1
Nebo můžete použít toto, pokud si myslíte, že to dává větší smysl nebo se to lépe čte. Výkon by měl být stejný, protože vysvětlení mi vysvětlilo, že je to stejné.
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
zobrazit ukázku http://sqlfiddle.com/#!2/05c8a/23
Nová strategie rozděl a panuj Vypalte více dotazů do databáze, což využije správné indexy. A odstraní potřebu dočasné tabulky a řazení souborů.
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
;
zobrazit ukázku http://sqlfiddle.com/#!2/454b3/61