Cập nhật:
Xem bài viết này trong blog của tôi để biết phân tích chi tiết hơn về vấn đề:
Khi bạn phát hành một cái gì đó như LIMIT 150000, 10 , có nghĩa là MySQL nên xem qua 150,000 này ghi lại và tìm 10 tiếp theo .
Duyệt qua chỉ mục chậm trong MySQL .
Ngoài ra, MySQL không có khả năng thực hiện tra cứu hàng muộn.
Về mặt lý thuyết, nếu bạn thực hiện ORDER BY id LIMIT 100000, 10 , chỉ cần sử dụng chỉ mục để tìm các giá trị từ 100000 là đủ thành 100010 , sau đó chỉ tra cứu 10 các hàng thỏa mãn chỉ mục đó và trả về chúng.
Tất cả các hệ thống chính ngoại trừ MySQL nhận thức được điều đó và chỉ tra cứu các hàng nếu các giá trị thực sự được trả về.
MySQL tuy nhiên, hãy tra cứu mọi hàng.
Cố gắng viết lại truy vấn của bạn như sau:
SELECT news.*
FROM (
SELECT id
FROM news
WHERE cat_id='4'
ORDER BY
id DESC
LIMIT 150000, 10
) o
JOIN news
ON news.id = o.id