我有如下表選擇主鍵:爲什麼Postgres的喜歡做連續掃描VS索引掃描
create table log
(
id bigint default nextval('log_id_seq'::regclass) not null
constraint log_pkey
primary key,
level integer,
category varchar(255),
log_time timestamp,
prefix text,
message text
);
它包含樣3萬行的。
我比較以下查詢:
EXPLAIN SELECT id
FROM log
WHERE log_time < now() - INTERVAL '3 month'
LIMIT 100000
這將產生以下計劃:
Limit (cost=0.00..19498.87 rows=100000 width=8)
-> Seq Scan on log (cost=0.00..422740.48 rows=2168025 width=8)
Filter: (log_time < (now() - '3 mons'::interval))
而且相同的查詢與ORDER BY ID指令補充說:
EXPLAIN SELECT id
FROM log
WHERE log_time < now() - INTERVAL '3 month'
ORDER BY id ASC
LIMIT 100000
收益率爲
Limit (cost=0.43..25694.15 rows=100000 width=8)
-> Index Scan using log_pkey on log (cost=0.43..557048.28 rows=2168031 width=8)
Filter: (log_time < (now() - '3 mons'::interval))
我有以下問題:
缺少ORDER BY的指令允許Postgres的不關心行的順序。他們也可以交付排序。爲什麼它不使用沒有ORDER BY的索引?
- Postgres如何在這樣的查詢中首先使用索引?
WHERE
查詢的子句包含非索引列,並且要讀取該列,將需要進行順序數據庫掃描,但帶有ORDER BY
的查詢不指示該查詢。
- Postgres如何在這樣的查詢中首先使用索引?
Postgres的手冊頁說:
對於需要掃描表的大部分的查詢,明確的排序是可能的,因爲它需要較少的磁盤I比使用索引快/ O由於以下順序訪問模式
能否請您澄清這個說法我嗎?索引總是有序的。讀取有序結構總是更快,它總是一個順序訪問(至少在頁面掃描方面)比讀取無序數據,然後手動排序。