Na sua primeira consulta, o ORDER BY é feito usando o
views_point
INDEX, pois foi usado na parte WHERE da consulta e, portanto, no MySQL pode ser usado para ordenação. Na segunda consulta, o MySQL resolve a parte WHERE usando um índice diferente,
listing_pcs
. Isso não pode ser usado para satisfazer a condição ORDER BY. O MySQL usa filesort em vez disso, que é a melhor opção se um índice não puder ser usado. O MySQL só usa índices para classificar se o índice for o mesmo usado na condição WHERE. Isto é o que manual significa por:
Então o que você pode fazer:
-
Tente aumentar seusort_buffer_size
config para tornar a classificação de arquivos o mais eficaz possível. Resultados grandes que são muito grandes para o buffer de classificação fazem com que o MySQL divida a classificação em partes, o que é mais lento.
-
Força o MySQL a escolher um índice diferente. Vale a pena notar que diferentes versões do MySQL escolhem os índices padrão de forma diferente. A versão 5.1, por exemplo, é muito ruim, pois o Query Optimizer foi amplamente reescrito para esta versão e precisava de muito refinamento. A versão 5.6 é muito boa.
SELECT * FROM listings FORCE INDEX (views_point) WHERE (`publishedon_hourly` BETWEEN UNIX_TIMESTAMP( '2015-09-5 00:00:00' ) AND UNIX_TIMESTAMP( '2015-09-5 12:00:00' )) AND (published =1) AND cat_id IN ( 1, 2, 3, 4, 5 ) ORDER BY `views_point` DESC LIMIT 10