2016-04-24 59 views
-1

比方说,我有以下查询:索引,而不会Where子句

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; 

“如果在姓氏列存在索引,查询可以使用此索引并避免排序......“

所以我开始考虑如果我在我打算总是排序的列上创建一个索引,那么“排序”会更快,即使我的查询的其余部分缺少位置,分组,等等。

+1

检查您的查询计划。 – randominstanceOfLivingThing

+1

没有使用限制最有效的方法将是每次查询的全表扫描 – Lucas

+0

索引应该有助于排序或所以我刚刚阅读,所以我想如果我在查询中使用索引只是“ Order By“并且没有”Where“条款,它将被有效地使用。 – LunchBox

回答

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。通过这种方式,您可以针对不同查询中的索引使用情况获得更快更准确的答案。

+0

谢谢Leonid!我知道你可以用LIMIT加快速度,但我只是想了解在不同场景下索引如何影响性能!我有大约5个月的数据分析经验,所以我很缺乏经验。感谢您的帮助,我欣赏它! – LunchBox

+0

@LunchBox我的意思是,具有限制的排序查询将需要全表扫描,除非您有索引。因此添加索引可能会大大加快此类查询速度。但是没有限制,postgres无论如何都不得不加载完整的数据集,所以差别不会那么大。 –

+0

使用索引与否,没有限制,全表扫描仍将完成这两个查询? – LunchBox