我已经创建了一个这样的表,
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)
未使用索引。有任何想法吗?我有10米的行。
答案 0 :(得分:2)
索引定义中有拼写错误,应为
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,还是有其他可能导致您的表统计信息不准确的内容?