Mysql
 sql >> Base de données >  >> RDS >> Mysql

Optimiser la requête MySql :Trop lent lors de la commande

Au lieu de placer le Order By dans la requête principale, encapsulez-la, comme ceci :

SELECT * FROM (   
  ... your query
) ORDER BY `created at`

Jetez un œil au plan de requête. Vous constaterez que dans votre cas, le tri s'effectue sur votre table mtrt_items avant que la jointure externe ne soit effectuée. Dans la réécriture que j'ai partiellement fournie, le tri est appliqué après les jointures externes, et est appliqué sur un ensemble beaucoup plus petit.

MISE À JOUR

En supposant que la LIMITE est appliquée à un grand ensemble (500 000 ?), il semble que vous puissiez effectuer le sommet avant de faire l'une des jointures.

SELECT * from (
    SELECT 
    `id`, ... `created_at`, ...
    ORDER BY `i`.`created_at` DESC 
    LIMIT 100 OFFSET 0) as i

    LEFT JOIN `mtrt_users` AS `u` ON i.user_id =u.id

    LEFT JOIN `twt_tweets_content` AS `t` ON t.id =i.id
    LEFT JOIN `twt_users` AS `tu` ON t.user_id = tu.id

    INNER JOIN `mtrt_items_searches` AS `r` ON i.id =r.item_id
    INNER JOIN `mtrt_searches` AS `s` ON s.id =r.search_id
    INNER JOIN `mtrt_searches_groups` AS `sg` ON sg.search_id =s.id
    INNER JOIN `mtrt_search_groups` AS `g` ON sg.group_id =g.id
    INNER JOIN `account_clients` AS `c` ON g.client_id =c.id                

GROUP BY i.id