2016-04-24 89 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