Thay vì đặt Order By
vào truy vấn chính, bọc nó lại, như sau:
SELECT * FROM (
... your query
) ORDER BY `created at`
Hãy xem kế hoạch truy vấn. Bạn sẽ thấy rằng trong trường hợp của mình, việc sắp xếp được thực hiện trên bảng của bạn mtrt_items
trước khi kết nối bên ngoài được thực hiện. Trong phần viết lại mà tôi đã cung cấp một phần, cách sắp xếp được áp dụng sau các phép nối bên ngoài và được áp dụng trên một nhóm nhỏ hơn nhiều.
CẬP NHẬT
Giả sử rằng LIMIT đang được áp dụng cho một tập hợp lớn (500.000?), Có vẻ như bạn có thể thực hiện phần trên trước khi thực hiện bất kỳ phép kết hợp nào.
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