查询与索引匹配,为什么对电影进行Seq扫描?它应该使用位图堆扫描。
psql(PostgreSQL)15.4(Homebrew)
联系方式:
CREATE INDEX movies_title_searchable ON movies USING gin(to_tsvector('english', title));
查询方式:
EXPLAIN ANALYZE
SELECT title
FROM movies
WHERE to_tsvector('english', title) @@ to_tsquery('english', 'night & day') LIMIT 1;
-> Seq Scan on movies (cost=0.00..2.31 rows=1 width=32) (actual time=0.035..0.035 rows=1 loops=1)
Filter: (to_tsvector('english'::regconfig, title) @@ '''night'' & ''day'''::tsquery)
Rows Removed by Filter: 3
1条答案
按热度按时间xxhby3vn1#
显然,由于表的大小(太小),postgres不会使用索引。
查询规划器可以确定从堆直接读取比索引扫描的成本更可取,即使存在可用的索引命中。如果索引扫描本身会返回表中的大部分数据,那么Postgres最常见的选择是此路径。因此,Postgres经常跳过小表的索引。