Mysql
 sql >> Database >  >> RDS >> Mysql

Evita filesort con INNER JOIN + ORDER BY

Puoi aiutare l'ottimizzatore MySQL spostando tutto il lavoro di filtraggio in una sottoquery che accede solo agli indici (la manipolazione degli indici è generalmente molto più veloce della manipolazione di altri dati) e recuperando il resto dei dati nella query più esterna:

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

Nota che ometto ORDER BY posts.post_id DESC dalla query esterna, perché di solito è più veloce ordinare il risultato finale nel codice piuttosto che ordinare utilizzando una query MySQL (MySQL usa spesso filesort per quello).

PS Puoi sostituire la chiave univoca in follow tabella con una chiave primaria.