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