Tôi tin rằng truy vấn bạn có có thể khớp với một tỷ lệ phần trăm lớn dữ liệu trong bảng. Trong những tình huống như vậy, trình tối ưu hóa MySQL thường chọn quét bảng và bỏ qua hoàn toàn các chỉ mục, vì nó thực sự nhanh hơn so với việc đọc thêm toàn bộ chỉ mục và sử dụng nó để chọn dữ liệu. Vì vậy, trong trường hợp này, tôi đoán rằng public_private='yes' and approved='yes'
phù hợp với một phần tốt của bảng của bạn. Do đó, nếu MySQL bỏ qua việc sử dụng chỉ mục vì lý do này, thì nó cũng không có sẵn để sắp xếp.
Nếu bạn thực sự muốn nó sử dụng một chỉ mục, thì giải pháp sẽ là sử dụng FORCE INDEX
:
select * from videos FORCE INDEX (approved_2) where public_private='public' and approved='yes' order by number_of_views desc;
Tuy nhiên, tôi sẽ chạy một số thử nghiệm để đảm bảo rằng những gì bạn nhận được thực sự nhanh hơn những gì mà trình tối ưu hóa MySQL đã chọn làm. Rõ ràng là trình tối ưu hóa có một số vấn đề với việc đưa ra các lựa chọn để đặt hàng, vì vậy bạn chắc chắn có thể thử điều này và xem liệu bạn có cải thiện được hiệu suất hay không.