为什么在订购时不使用索引?

时间:2011-05-16 20:01:26

标签: sql postgresql

我有这个表结构:

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 个答案:

答案 0 :(得分:2)

如何定义索引不会更改查询的含义。为了使用索引,索引的顺序必须与查询的顺序相匹配。

话虽如此,doesn't appear that MySQL supports nulls last。尝试:

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

答案 1 :(得分:1)

您的查询实际上是ORDER BY login_count DESC NULLS FIRST LIMIT 30,如here所述。在this page上,它描述了索引如何满足排序:

  

以升序存储的索引   首先使用nulls可以满足任何一个   ORDER BY x ASC NULLS FIRSTORDER BY x DESC NULLS LAST   取决于扫描的方向。

所以你的索引是相同的 - 它可以满足ASC NULLS FIRSTDESC NULLS LAST,但你的查询是DESC NULLS FIRST