¿Ordenar por columna debe tener índice o no?

35

He agregado índices a la tabla que se utilizan para buscar resultados. Estoy mostrando resultados por orden ASC o DESC. Entonces, ¿esa columna debe tener índice o no? Tengo 2 índices más en esa tabla. ¿Cómo afectará el rendimiento al hacer o no hacer un índice en esa columna?

Somnath Muluk
fuente
2
Publique

Respuestas:

26

Sí, MySQL puede usar un índice en las columnas en ORDER BY (bajo ciertas condiciones). Sin embargo, MySQL no puede usar un índice para ASC mixto , orden DESC por ( SELECT * FROM foo ORDER BY bar ASC, pants DESC). Compartir su consulta y la declaración CREATE TABLE nos ayudaría a responder su pregunta más específicamente.

Para obtener sugerencias sobre cómo optimizar las cláusulas ORDER BY: http://dev.mysql.com/doc/refman/5.1/en/order-by-optimization.html

Editar 2012-01-21 8:53 AM

Hubo preguntas sobre el origen de mi declaración sobre el uso de un índice con ASC / DESC mixto en ORDER BY. De la documentación de ORDER BY Optimization :

En algunos casos, MySQL no puede usar índices para resolver ORDER BY, aunque todavía usa índices para encontrar las filas que coinciden con la cláusula WHERE. Estos casos incluyen lo siguiente:

...

Mezclas ASC y DESC:

SELECCIONAR * DESDE t1 ORDER BY key_part1 DESC, key_part2 ASC;

...

Además, la palabra clave DESC no tiene sentido en CREATE INDEX

Una especificación index_col_name puede terminar con ASC o DESC. Estas palabras clave están permitidas para futuras extensiones para especificar el almacenamiento de valor de índice ascendente o descendente. Actualmente, se analizan pero se ignoran; los valores de índice siempre se almacenan en orden ascendente.

Aaron Brown
fuente
3
"MySQL no puede usar un índice para ASC mixto, DESC" . Referencia para esto?
ypercubeᵀᴹ
CREATE INDEX idx_foo ON foo(bar ASC, pants DESC);Deberia trabajar.
Frank Heikens
Mi fuente es la documentación de mysql vinculada en mi respuesta. Busque "mezclar".
Aaron Brown el
3
MySQL analiza asc & Desc en CREATE INDEX, pero los ignora. Los índices siempre se almacenan en orden ascendente. dev.mysql.com/doc/refman/5.5/en/create-index.html
Aaron Brown
1
Nuevo con MySQL 8.0 : Ahora se puede usar una mezcla de ASCy DESC si el INDEXtiene la misma mezcla.
Rick James
4

Para cualquiera que se pregunte sobre la respuesta en relación con PostgreSQL, la respuesta es sí, se utilizará un índice. Según la documentación de PostgreSQL, el planificador de consultas "considerará satisfacer una especificación ORDER BY, ya sea escaneando un índice disponible que coincida con la especificación, o escaneando la tabla en orden físico y haciendo una ordenación explícita". Esto significa que si hay un índice que el planificador puede usar, lo hará, volviendo a ordenar después de recuperar las filas coincidentes.

douglasr
fuente