I have speed problems with a MySQL query. The tables definitions are as follows:
CREATE TABLE IF NOT EXISTS `student` (
`student_id` int(11) unsigned NOT NULL
I can't test this very easily, but try using this student_sort
key:
KEY
student_sort(
student_college,
countupDESC ,
updated_timeDESC)
Query below will remove Using temporary; Using filesort. from the explain so this should run better in thoery..
MySQL optimizer is dumb so the trick is to force the optimizer want you want and that is an derived table based on college.college_location = 1. So you can INNER JOIN the result with the student table. And this way MySQL can use the sort key
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
Note the new index in caps lock
See demo http://sqlfiddle.com/#!2/05c8a/1
Or you can use this if you think it makes more sense or is easier to read. The performance should be the same because the explain explained to me that it is the same.
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
see demo http://sqlfiddle.com/#!2/05c8a/23
New strategy divide and conquer method Fire more querys to the database what will make use off correct indexes. And remove the need for an temporary table and filesort.
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
;
see demo http://sqlfiddle.com/#!2/454b3/61
Try index:
KEY student_sort(countup DESC ,updated_time DESC)
Then use STRAIGHT_JOIN and FORCE INDEX:
SELECT *
FROM student force index(student_sort) STRAIGHT_JOIN
college
ON student.student_college = college.college_id
WHERE college_location = 1
ORDER BY student.countup desc,
student.updated_time desc
LIMIT 15;