Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Indexação do MySQL e usando filesort


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:

  1. Tente aumentar seu sort_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.

  2. 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