我有这个桌子结构:

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列可能由空值组成,我需要选择按login_count降序排列的所有用户,并且需要在末尾使用空值。
很遗憾,此查询:
SELECT * FROM users ORDER BY login_count DESC LIMIT 30;

不会使用索引,所以空的是在乞讨,为什么?

最佳答案

here所述,您的查询实际上是ORDER BY login_count DESCNULLS FIRSTLIMIT 30。在this page上,它描述了索引如何满足排序:
按升序存储的索引
首先使用空值可以满足
ORDER BY x ASC NULLS FIRSTORDER BY x DESC NULLS LAST
取决于扫描方向。
所以您的索引是相同的-它可以满足ASC NULLS FIRSTDESC NULLS LAST,但是您的查询是DESC NULLS FIRST

10-07 12:38