我有这个桌子结构:
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 DESC
NULLS FIRST
LIMIT 30
。在this page上,它描述了索引如何满足排序:
按升序存储的索引
首先使用空值可以满足ORDER BY x ASC NULLS FIRST
或ORDER BY x DESC NULLS LAST
取决于扫描方向。
所以您的索引是相同的-它可以满足ASC NULLS FIRST
和DESC NULLS LAST
,但是您的查询是DESC NULLS FIRST
。