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