sql >> Base de Datos >  >> RDS >> Mysql

MySQL indexación y uso de clasificación de archivos

En su primera consulta, ORDER BY se realiza utilizando el views_point ÍNDICE, porque se usó en la parte DONDE de la consulta y, por lo tanto, en MySQL se puede usar para clasificar.

En la segunda consulta, MySQL resuelve la parte WHERE usando un índice diferente, listing_pcs . Esto no se puede utilizar para satisfacer la condición ORDER BY. MySQL usa filesort en su lugar, que es la mejor opción si no se puede usar un índice.

MySQL solo usa índices para ordenar si el índice es el mismo que se usó en la condición WHERE. Esto es lo que el manual significa por:

Entonces, ¿qué puedes hacer?:

  1. Intenta aumentar tu sort_buffer_size opción de configuración para que la clasificación de archivos sea lo más efectiva posible. Los resultados grandes que son demasiado grandes para el búfer de clasificación hacen que MySQL divida la clasificación en fragmentos, lo que es más lento.

  2. Obligar a MySQL a elegir un índice diferente. Vale la pena señalar que las diferentes versiones de MySQL eligen los índices predeterminados de manera diferente. La versión 5.1, por ejemplo, es bastante mala ya que el Optimizador de consultas se reescribió en gran medida para esta versión y necesitaba muchas mejoras. La versión 5.6 es bastante buena.

    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