MySQL slow query using filesort

后端 未结 3 1673
故里飘歌
故里飘歌 2021-01-27 17:57

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          


        
相关标签:
3条回答
  • 2021-01-27 18:36

    I can't test this very easily, but try using this student_sort key:

    KEYstudent_sort(student_college,countupDESC ,updated_timeDESC)

    0 讨论(0)
  • 2021-01-27 18:38

    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

    0 讨论(0)
  • 2021-01-27 18:38

    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;
    
    0 讨论(0)
提交回复
热议问题