查询与索引匹配,为什么对电影进行Seq Scan?它应该使用位图堆扫描。
psql (PostgreSQL) 15.4(自制)
索引:
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
显然,由于表大小(太小),postgres 不会使用索引。
查询规划器可能会确定从堆中直接读取比索引扫描的成本更可取,即使有可用的索引命中。如果索引扫描本身会返回表中的大部分数据,那么 Postgres 最常见的是选择此路径。因此,Postgres 经常跳过小表的索引。