0
我有2個表如下:爲什麼Postgres的不使用我的查詢索引
tb_st:
Columns:
st_id | integer
st | character varying(80)
type | integer
Indexes:
PRIMARY KEY (st_id)
UNIQUE INDEX (st, type)
INDEX (st)
tb_pd:
Column
st_id | integer
bot_id | integer
Indexes:
PRIMARY KEY (st_id, bot_id)
INDEX (bot_id)
Foreign-key constraints:
FOREIGN KEY (st_id) REFERENCES tb_st(st_id)
當我解釋查詢:
select p.bot_id
from tb_pd p inner join
tb_st s
on p.st_id = s.st_id
where s.st = 'abc' and s.type = 1
的Postgres給了我這樣的:
Nested Loop (cost=4.24..16.10 rows=11 width=194)
-> Seq Scan on tb_st s (cost=0.00..1.07 rows=1 width=186)
Filter: (((st)::text = 'abc'::text) AND (type = 1))
-> Bitmap Heap Scan on tb_pd p (cost=4.24..14.91 rows=11 width=8)
Recheck Cond: (st_id = s.st_id)
-> Bitmap Index Scan on tb_pd_pkey (cost=0.00..4.24 rows=11 width=0)
Index Cond: (st_id = s.st_id)
(7 rows)
經過一段時間,給了我這個完全相同的查詢(仍然沒有使用索引):
Nested Loop (cost=0.00..2.19 rows=1 width=4)
Join Filter: (p.st_id = s.st_id)
-> Seq Scan on tb_st s (cost=0.00..1.07 rows=1 width=4)
Filter: (((st)::text = 'abc'::text) AND (type = 1))
-> Seq Scan on tb_pd p (cost=0.00..1.05 rows=5 width=8)
(5 rows)
我的問題是:如果我只是過濾了一個st值和一個構成UNIQUE INDEX的類型值,爲什麼這個獨特的索引沒有被使用?
這就是發生了什麼事。我使用數百萬個假行填充了表以進行測試,解釋使用了所有內容的索引!我喜歡postgres! –