没有Where子句的索引

时间:2016-04-24 16:46:43

标签: postgresql indexing

假设我有以下问题:

select col_1, col_2, col_3
from table
order by col_1;

在col_1上有索引。

这里有效地使用索引吗?我没有where子句,但我确实有“Order By”,所以我很想知道。

编辑第2部分:让我假装我有一个包含100万行的表。

编辑以提供问题背景:

我正在读一本关于数据库管理的书,这就是它所说的:

SELECT last_name, first_name, middle_initial, empno, position
FROM employee
WHERE position IN ('MANAGER', 'DIRECTOR', 'VICE PRESIDENT')
ORDER BY last_Name;

“如果last_name列上存在索引,则查询可以使用此索引并避免排序...”

所以我开始认为如果我在我计划总是排序的列上创建索引,“排序”会更快,即使我的查询的其余部分缺少where,group by,having等等。

1 个答案:

答案 0 :(得分:1)

为了清理这里我做了一个简单的模拟。

首先,我创建了一个空表:

CREATE TABLE so_test (
  col_1 bigint,
  col_2 bigint,
  col_3 bigint
);

CREATE INDEX col_1 ON so_test USING btree (col_1);

并运行两个EXPLAIN个查询:

explain select col_1, col_2, col_3
from so_test
order by col_1;
Index Scan using col_1 on so_test  (cost=0.15..66.80 rows=1510 width=24)
explain select col_1, col_2, col_3
from so_test
order by col_2;
Sort  (cost=104.83..108.61 rows=1510 width=24)
  Sort Key: col_2
  ->  Seq Scan on so_test  (cost=0.00..25.10 rows=1510 width=24)

因此,在col_1上建立一个索引将完全消除执行排序操作的任何需要,并在某种程度上加快速度。

但是,为了看到添加索引的速度相当快,您应该使用LIMIT查询。

将来你应该熟悉postgres查询器和EXPLAIN command。这样,您可以在不同查询中获得更快,更准确的索引使用答案。