Alih-alih menempatkan Order By
ke dalam kueri utama, bungkus, seperti ini:
SELECT * FROM (
... your query
) ORDER BY `created at`
Lihatlah rencana kueri. Anda akan menemukan bahwa dalam kasus Anda, pengurutan dilakukan pada tabel Anda mtrt_items
sebelum outer join dilakukan. Dalam penulisan ulang yang saya berikan sebagian, pengurutan diterapkan setelah gabungan luar, dan diterapkan pada set yang jauh lebih kecil.
PERBARUI
Dengan asumsi bahwa LIMIT diterapkan ke kumpulan besar (500.000?), sepertinya Anda dapat melakukan yang teratas sebelum melakukan gabungan apa pun.
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