sql >> Databasteknik >  >> RDS >> Mysql

MySQL långsam fråga med hjälp av filsortering

Frågan nedan kommer att ta bort Using temporary; Använder filsortering. från förklara så detta borde fungera bättre i thoery..

MySQL optimizer är dumt så tricket är att tvinga den optimizer du vill ha och det är en härledd tabell baserad på college.college_location =1. Så du kan INNER JOIN resultatet med studenttabellen. Och på detta sätt kan MySQL använda sorteringsnyckeln

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

Observera det nya indexet i caps lock

Se demo http://sqlfiddle.com/#!2/05c8a/1

Eller så kan du använda det här om du tycker att det är mer vettigt eller är lättare att läsa. Föreställningen bör vara densamma eftersom den förklarade för mig att den är densamma.

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

se demo http://sqlfiddle.com/#!2/05c8a/23

Ny strategi skilje och erövra metod Skicka fler förfrågningar till databasen, vilket kommer att använda korrekta index. Och ta bort behovet av en temporär tabell och filsortering.

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
;

se demo http://sqlfiddle.com/#!2/454b3/61



  1. Refererar till främmande nycklar i samma kolumn

  2. RETURNING orsakar fel:FROM-satspost saknas för tabellen

  3. Spara Python Pickled-objekt i MySQL db

  4. Connect DATABASE-fel TYP:2002:Tillstånd nekad