Почему индекс не используется при оформлении заказа? - PullRequest
0 голосов
/ 17 мая 2011

У меня есть эта структура таблицы:

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)
)

с этим индексом:

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

Столбец login_count может состоять из значений NULL, и мне нужно выбрать всех пользователей, упорядоченных по убыванию по имени login_countи нужно, чтобы значения NULL были в конце.

К сожалению, этот запрос:

SELECT * FROM users ORDER BY login_count DESC LIMIT 30;

не будет использовать индекс, поэтому значения NULL находятся в начале, почему?

Ответы [ 2 ]

2 голосов
/ 17 мая 2011

То, как определяется индекс, не меняет смысла запроса. Чтобы индекс использовался, порядок индекса должен соответствовать порядку запроса.

Сказав это, не похоже, что MySQL поддерживает nulls last. Попробуйте:

SELECT  * 
FROM    users
ORDER BY
        case when login_count is null then -1 else login_count end DESC 
LIMIT 30;
1 голос
/ 17 мая 2011

Ваш запрос эффективен ORDER BY login_count DESCNULLS FIRSTLIMIT 30 как объяснено здесь .На этой странице описывается, как индекс может удовлетворять порядку:

Индекс, сохраненный в порядке возрастания с нулевыми первыми, может удовлетворять либо ORDER BY x ASC NULLS FIRST, либо ORDER BY x DESC NULLS LAST, в зависимости отнаправление его сканирования.

Таким образом, ваш индекс такой же - он может удовлетворить ASC NULLS FIRST и DESC NULLS LAST, но ваш запрос DESC NULLS FIRST.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...