2012-04-11 24 views
20

Tengo una tabla de la que necesito obtener filas ordenadas por un campo en orden descendente. Cuando se ejecuta una consulta EXPLAIN como la siguiente:¿Cómo creo un índice DESC en MySQL?

EXPLAIN SELECT ... FROM table WHERE ... ORDER BY field DESC 

consigo Using where; Using filesort en la columna de la Extra. Así que trato de crear un índice DESC:

CREATE INDEX name ON table (field DESC); 

Pero cuando corro EXPLAIN de nuevo, tengo la misma Using where; Using filesort en la columna de la Extra y el funcionamiento es más o menos la misma.

¿Qué estoy haciendo mal?

Respuesta

43

Esa es una de esas "características" de MySQL donde silenciosamente ignora su petición de hacer algo porque simplemente no está implementado:.

De http://dev.mysql.com/doc/refman/5.5/en/create-index.html

" Una especificación index_col_name puede acabar con ASC o DESC Estos se permiten palabras clave para futuras extensiones para especificar almacenamiento de valor de índice ascendente o descendente. Actualmente, se analizan pero se ignoran; los valores de índice siempre se almacenan en orden ascendente "

+2

Y también lo son los índices "hash". ¿Por qué los desarrolladores de MySQL permiten todo en su declaración "CREATE INDEX" pero no implementan nada? – akki

10

Como se mencionó, la función no es implementar nted pero algunas soluciones pueden ser de interés:

Una posibilidad es almacenar el campo en un valor negado o reverso.

Si se trata de un número que puede almacenar (-n) o (MAXVAL -n) si no firmada

Si se trata de una fecha o marca de tiempo, algunos podrían abogar para almacenar un número en lugar de uso y funciones tales como FROM_UNIXTIME ()

por supuesto, este cambio no se realiza siempre fácil ... depende de código existente, etc.

1

MySQL partir de la versión 8 es compatible con los índices de la descripción. Antes de eso, DESC fue ignorado en silencio. Esto no fue un problema para (a) índices de una sola columna o (b) para índices de varias columnas donde todas las columnas tenían una sola dirección: todas las ASC o todas las DESC, ya que los índices son bidireccionales.

Pero si necesita un índice de varias columnas donde las instrucciones de las columnas son diferentes, p. ejecuta varias manos de papel así:

SELECT * from MyTable WHERE ColumnA = 1 ORDER BY ColumnB ASC, ColumnC DESC 

que necesita el siguiente índice: (ColumnA, ColumnB ASC, ColumnC DESC)

Se puede crear un índice con estos parámetros en MySQL anteriores a la versión 8, pero creado sliently de hecho (ColumnA ASC, ColumnB ASC, ColumnC ASC)

Por lo tanto, su consulta no pudo usar ese índice en su totalidad; solo tomó las columnas A y B del índice, mientras utilizaba unindexed (filesort) para la columna C

Esto ya no será un problema en MySQL 8.0 y una versión posterior. Ver https://dev.mysql.com/doc/refman/8.0/en/descending-indexes.html

Cuestiones relacionadas