gpt4 book ai didi

postgresql - GIN索引怎么了,绕不开SEQ扫描?

转载 作者:行者123 更新时间:2023-11-29 12:10:09 24 4
gpt4 key购买 nike

我创建了一个这样的表,

create table mytable(hash char(40), title varchar(500));
create index name_fts on mytable using gin(to_tsvector('english', 'title'));
CREATE UNIQUE INDEX md5_uniq_idx ON mytable(hash);

当我查询标题时,

test=# explain analyze select * from mytable where to_tsvector('english', title) @@ 'abc | def'::tsquery limit 10;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------
Limit (cost=0.00..277.35 rows=10 width=83) (actual time=0.111..75.549 rows=10 loops=1)
-> Seq Scan on mytable (cost=0.00..381187.45 rows=13744 width=83) (actual time=0.110..75.546 rows=10 loops=1)
Filter: (to_tsvector('english'::regconfig, (title)::text) @@ '''abc'' | ''def'''::tsquery)
Rows Removed by Filter: 10221
Planning time: 0.176 ms
Execution time: 75.564 ms
(6 rows)

未使用索引。有任何想法吗?我有 1000 万行。

最佳答案

你的索引定义有错字,应该是

ON mytable USING gin (to_tsvector('english', title))

代替

ON mytable USING gin (to_tsvector('english', 'title'))

按照你写的方式,它是一个常量而不是一个被索引的字段,而且这样的索引对于像你执行的搜索这样的搜索确实是无用的。

要查看索引是否可以,可以执行

SET enable_seqscan=off;

然后再次运行查询。
如果仍然没有使用索引,则可能无法使用索引。

除上述内容外,您的执行计划还有一些让我感到奇怪的地方。 PostgreSQL 估计 mytable 的顺序扫描将返回 13744 行,而不是您所说的 1000 万行。您是否禁用了 autovacuum 或是否有其他原因可能导致您的表统计信息不准确?

关于postgresql - GIN索引怎么了,绕不开SEQ扫描?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40570087/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com