sql >> Databasteknik >  >> RDS >> Mysql

Undvik filsortering med INNER JOIN + BESTÄLL EFTER

Du kan hjälpa MySQL-optimeraren genom att flytta allt filtreringsarbete till en underfråga som endast kommer åt index (att manipulera index är vanligtvis mycket snabbare än att manipulera andra data) och hämta resten av data i den yttersta frågan:

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

Observera att jag utelämnar ORDER BY posts.post_id DESC från den yttre frågan, eftersom det vanligtvis är snabbare att sortera slutresultatet i din kod istället för att sortera med en MySQL-fråga (MySQL använder ofta filesort för det).

P.S. Du kan ersätta den unika nyckeln i follow tabell med en primärnyckel.




  1. Hur man ansluter till databasen med NaviCat MySQL-klient

  2. Fulltextsökning med InnoDB

  3. Buffertcache:Vad är det och hur påverkar det databasens prestanda?

  4. Django-modeller:standardvärde för kolumn