¿Por qué no se utiliza el índice al realizar el pedido?

Tengo esta estructura de tabla:

CREATE TABLE users
(
uid bigint NOT NULL,
first_name character varying,
last_name character varying,
email character varying,
login_count integer,
CONSTRAINT users_pkey PRIMARY KEY (uid)
)

con este índice:

CREATE INDEX users__login_count
ON users
USING btree
(login_count DESC NULLS LAST);

La columna login_count puede constar de valores NULL y necesito seleccionar todos los usuarios ordenados de forma descendente por login_count y necesito que los NULL estén al final.

Desafortunadamente esta consulta:

SELECT * FROM users ORDER BY login_count DESC LIMIT 30;

no usará el índice, por lo que los NULL están al principio, ¿por qué?

preguntado el 16 de mayo de 11 a las 20:05

2 Respuestas

Tu consulta es eficaz ORDER BY login_count DESCNULLS FIRSTLIMIT 30 como se explica aquí. En consulta en esta página describe cómo un índice puede satisfacer un pedido:

Un índice almacenado en orden ascendente con nulos primero puede satisfacer ORDER BY x ASC NULLS FIRST or ORDER BY x DESC NULLS LAST dependiendo de la dirección en la que se escanee.

Entonces su índice es el mismo, puede satisfacer ASC NULLS FIRST y DESC NULLS LAST, pero tu consulta es DESC NULLS FIRST.

contestado el 17 de mayo de 11 a las 00:05

La forma en que se define un índice no cambia el significado de una consulta. Para que se utilice el índice, el orden del índice debe coincidir con el orden de la consulta.

Habiendo dicho eso, es no parece que MySQL admita nulls last. Intentar:

SELECT  * 
FROM    users
ORDER BY
        case when login_count is null then -1 else login_count end DESC 
LIMIT 30;

contestado el 17 de mayo de 11 a las 00:05

tal vez un error tipográfico, pero OP está hablando de PostgreSQL, no de MySQL. - miel

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.