Uważam, że zapytanie, które masz, prawdopodobnie pasuje do dużego odsetka danych w tabeli. W takich sytuacjach optymalizator MySQL często decyduje się na skanowanie tabeli i całkowite ignorowanie indeksów, ponieważ jest to w rzeczywistości szybsze niż zadawanie się z dodatkowym odczytem całego indeksu i używanie go do pobrania danych. Więc w tym przypadku zgaduję, że public_private='yes' and approved='yes'
pasuje do sporej części twojego stołu. Dlatego też, jeśli MySQL pomija z tego powodu używanie indeksu, nie jest on również dostępny do sortowania.
Jeśli naprawdę chcesz, aby korzystał z indeksu, rozwiązaniem byłoby użycie FORCE INDEX
:
select * from videos FORCE INDEX (approved_2) where public_private='public' and approved='yes' order by number_of_views desc;
Przeprowadziłbym jednak kilka testów, aby upewnić się, że to, co otrzymujesz, jest faktycznie szybsze niż to, co wybrał optymalizator MySQL. Najwyraźniej optymalizator ma pewne problemy z dokonywaniem wyborów do zamówienia, więc z pewnością możesz spróbować i zobaczyć, czy uzyskasz lepszą wydajność.