Acredito que a consulta que você tem provavelmente corresponde a uma grande porcentagem dos dados na tabela. Em situações como essa, o otimizador do MySQL geralmente opta por fazer uma varredura de tabela e ignorar os índices completamente, pois é realmente mais rápido do que passar pelo problema da leitura adicional de todo o índice e usá-lo para selecionar os dados. Então, neste caso, estou supondo que
public_private='yes' and approved='yes'
corresponde a uma boa parte da sua mesa. Portanto, se o MySQL pular usando o índice por causa disso, ele também não estará disponível para classificação. Se você realmente deseja que ele use um índice, a solução seria usar
FORCE INDEX
:select * from videos FORCE INDEX (approved_2) where public_private='public' and approved='yes' order by number_of_views desc;
No entanto, eu faria alguns testes para ter certeza de que o que você está obtendo é realmente mais rápido do que o otimizador do MySQL escolheu fazer. Aparentemente, o otimizador tem alguns problemas fazendo seleções para pedidos, então você pode definitivamente tentar e ver se obtém um desempenho aprimorado.