sql >> Database >  >> RDS >> Mysql

Vermijd filesort met INNER JOIN + ORDER BY

U kunt MySQL-optimizer helpen door al het filterwerk te verplaatsen naar een subquery die alleen toegang heeft tot indices (het manipuleren van indices is meestal veel sneller dan het manipuleren van andere gegevens), en de rest van de gegevens in de buitenste query op te halen:

SELECT posts.post_id,
       posts.post_b_id,
       posts.post_title,
       posts.post_cont,
       posts.thumb,
       posts.post_user,
       boards.board_title_l,
       boards.board_title
FROM   (SELECT post_id
        FROM   posts
               JOIN follow
                 ON posts.post_b_id = follow.board_id
        WHERE  follow.user_id = 1
        ORDER  BY post_id DESC
        LIMIT  10) sq
       JOIN posts
         ON posts.post_id = sq.post_id
       JOIN boards
         ON boards.board_id = posts.post_b_id

Merk op dat ik ORDER BY posts.post_id DESC . weglaat van de buitenste query, omdat het meestal sneller is om het uiteindelijke resultaat in uw code te sorteren in plaats van te sorteren met behulp van een MySQL-query (MySQL gebruikt vaak filesort daarvoor).

PS U kunt de unieke sleutel vervangen in het follow tabel met een primaire sleutel.




  1. hoe maak je een tabel in orakel

  2. Waarom worden 2 rijen beïnvloed in mijn `INSERT ... ON DUPLICATE KEY UPDATE`?

  3. MySQL PI() Functie – Retourneer de waarde van π (pi)

  4. Hoe krijg ik min, mediaan en max van mijn query in postgresql?