Заявката по-долу ще премахне Using temporary; Използване на filesort. от обяснението, така че това трябва да работи по-добре на теория..
Оптимизаторът на MySQL е тъп, така че номерът е да принудите оптимизатора, който искате, и това е производна таблица, базирана на college.college_location =1. Така че можете да INNER JOIN резултата с таблицата на ученика. И по този начин MySQL може да използва ключа за сортиране
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
Обърнете внимание на новия индекс в Caps Lock
Вижте демонстрация http://sqlfiddle.com/#!2/05c8a/1
Или можете да използвате това, ако смятате, че има повече смисъл или е по-лесно за четене. Изпълнението трябва да е същото, защото обяснението ми обясни, че е същото.
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
вижте демонстрация http://sqlfiddle.com/#!2/05c8a/23
Нов метод за стратегия „разделяй и владей“ Задействайте повече заявки към базата данни, което ще използва правилните индекси. И премахнете необходимостта от временна таблица и сортиране на файлове.
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
;
вижте демонстрация http://sqlfiddle.com/#!2/454b3/61