sql >> Databáze >  >> RDS >> Mysql

Pomalý dotaz MySQL pomocí řazení souborů

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



  1. Výpočet kumulativního denního součtu v PostgreSQL

  2. Chyba:Výplň:Vlastnost SelectCommand.Connection nebyla inicializována.

  3. Je index v Oracle seskupený nebo unclustered?

  4. Jak najít poslední den v měsíci na serveru SQL