gpt4 book ai didi

postgresql - Postgres 中缓慢的 varchar 索引性能

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

我有一个包含大约 500,000 行的表,其中一列的值类似于 Brutus, Wanton Wasteland 的梦想家。我需要对这些进行不区分大小写的 LIKE 查询,但它的执行速度似乎很慢。我尝试用以下方法制作索引:

create index name_idx on deck (name);

create index deck_name_idx on deck (lower(name));

但是无论哪种方式,查询都同样慢。这是我的查询:

select * 
from deck
where lower(deck.name) like '%brutus, dreamer of the%'
order by deck.id desc
limit 20

这是我解释分析的结果(这是第二个索引,但都同样慢。)

Limit  (cost=152534.89..152537.23 rows=20 width=1496) (actual time=627.480..627.490 rows=1 loops=1)
-> Gather Merge (cost=152534.89..152539.56 rows=40 width=1496) (actual time=627.479..627.488 rows=1 loops=1)
Workers Planned: 2
Workers Launched: 2
-> Sort (cost=151534.87..151534.92 rows=20 width=1496) (actual time=611.447..611.447 rows=0 loops=3)
Sort Key: id DESC
Sort Method: quicksort Memory: 25kB
-> Parallel Seq Scan on deck (cost=0.00..151534.44 rows=20 width=1496) (actual time=609.818..611.304 rows=0 loops=3)
Filter: (lower((name)::text) ~~ '%brutus, dreamer of the%'::text)
Rows Removed by Filter: 162210
Planning time: 0.786 ms
Execution time: 656.510 ms

有没有更好的方法来设置这个索引?如果必须的话,我可以将该列非规范化为小写版本,但我宁愿不这样做,除非它会有很大帮助并且没有更好的方法。

最佳答案

要支持开头没有通配符的LIKE 查询,请使用

CREATE INDEX ON deck (lower(name) varchar_pattern_ops);

要支持可以在开头使用通配符的LIKE 搜索,您可以

CREATE EXTENSION pg_trgm;
CREATE INDEX ON deck USING gin (lower(name) gin_trgm_ops);

关于postgresql - Postgres 中缓慢的 varchar 索引性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54173068/

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