postgresql Postgres全文搜索到_tsvector不使用索引

f1tvaqid  于 2023-10-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(115)

查询与索引匹配,为什么对电影进行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
xxhby3vn

xxhby3vn1#

显然,由于表的大小(太小),postgres不会使用索引。
查询规划器可以确定从堆直接读取比索引扫描的成本更可取,即使存在可用的索引命中。如果索引扫描本身会返回表中的大部分数据,那么Postgres最常见的选择是此路径。因此,Postgres经常跳过小表的索引。

相关问题