Trên thực tế, bạn không thể tối ưu hóa truy vấn đó.
Bạn đang sắp xếp kết quả bằng cách sử dụng một giá trị được tính toán, vì vậy bạn không thể sử dụng một chỉ mục. Nếu bạn sử dụng explain
bạn có thể thấy truy vấn của mình đang được thực thi như thế nào và using temporary
tạm thời sẽ có mặt trong extra
, có nghĩa là tất cả dữ liệu từ truy vấn của bạn đang được lưu trữ trên một bảng tạm thời, trong đó thứ tự được thực hiện.
Không quan trọng nếu bạn chỉ muốn 50 kết quả phù hợp đầu tiên trong truy vấn, trước tiên nó phải lấy tất cả dữ liệu, chuyển nó vào một bảng tạm thời, sắp xếp kết quả trong bảng đó và sau đó trả lại cho bạn 50 kết quả phù hợp đầu tiên.
Như bạn có thể giả sử, đây là một hoạt động tiêu tốn thời gian và bộ nhớ.
Vì vậy, tùy chọn tốt nhất của bạn là đặt một chỉ mục trong bảng để lấy tất cả các hàng bạn cần nhanh nhất có thể và sau đó xử lý chúng bằng php
để lấy dữ liệu bạn cần.
Nhân tiện, hãy xem Hướng dẫn tối ưu hóa MySQL .