介绍PostgreSQL模糊匹配走索引的操作
这篇文章主要介绍了PostgreSQL模糊匹配走索引的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧。
场景 lower(name) like 'pf%'
create table users (id int primary key, name varchar(255)); Create or replace function random_string(length integer) returns text as $$ declare chars text[] := '{0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z}'; result text := ''; i integer := 0; begin if length < 0 then raise exception 'Given length cannot be less than 0'; end if; for i in 1..length loop result := result || chars[1+random()*(array_length(chars, 1)-1)]; end loop; return result; end; $$ language plpgsql; insert into users values(generate_series(1,50000), random_string(15));
普通bt:不走索引
pg_trgm模块提供函数和操作符测定字母数字文本基于三元模型匹配的相似性,还有支持快速搜索相似字符串的索引操作符类。三元模型是一组从一个字符串中获得的三个连续的字符。我们可以通过计数两个字符串共享的三元模型的数量来测量它们的相似性。这个简单的想法证明在测量许多自然语言词汇的相似性时是非常有效的。
1CREATE INDEX users_idx0 ON users (name);
全字匹配查询(走索引)
explain select * from users where name='pfDNQVmhqDrF1EY'; QUERY PLAN ------------------------------------------------------------------------- Index Scan using users_idx0 on users (cost=0.29..8.31 rows=1 width=20) Index Cond: ((name)::text = 'pfDNQVmhqDrF1EY'::text) (2 rows)
加函数全字匹配(不走索引)
explain select * from users where lower(name)='pfDNQVmhqDrF1EY'; QUERY PLAN ----------------------------------------------------------- Seq Scan on users (cost=0.00..1069.00 rows=250 width=20) Filter: (lower((name)::text) = 'pfDNQVmhqDrF1EY'::text) (2 rows)
模糊匹配(不走索引)
explain select * from users where name like 'pf%'; QUERY PLAN -------------------------------------------------------- Seq Scan on users (cost=0.00..944.00 rows=5 width=20) Filter: ((name)::text ~~ 'pf%'::text)
explain select * from users where name like 'pf_'; QUERY PLAN -------------------------------------------------------- Seq Scan on users (cost=0.00..944.00 rows=5 width=20) Filter: ((name)::text ~~ 'pf_'::text)
字段带函数的bt索引:函数走索引
drop index users_idx0;CREATE INDEX users_dex1 ON users (lower(name));
加函数全字匹配(走索引)
explain select * from users where lower(name)='pfDNQVmhqDrF1EY'; QUERY PLAN --------------------------------------------------------------------------- Bitmap Heap Scan on users (cost=6.23..324.34 rows=250 width=20) Recheck Cond: (lower((name)::text) = 'pfDNQVmhqDrF1EY'::text) -> Bitmap Index Scan on users_dex1 (cost=0.00..6.17 rows=250 width=0) Index Cond: (lower((name)::text) = 'pfDNQVmhqDrF1EY'::text) (4 rows)
模糊匹配(不走索引)
explain select * from users where lower(name) like 'pf%'; QUERY PLAN ----------------------------------------------------------- Seq Scan on users (cost=0.00..1069.00 rows=250 width=20) Filter: (lower((name)::text) ~~ 'pf%'::text) (编辑:锡盟站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 德国、西班牙的苹果地图用户现在可以报告交通事故
- 消息称一加 Nord 2 CE 下一年初发布,支持 microSD 卡
- Win11首个重大更新!Win 11 22H2系统将提早到8月份推出
- 线下买了电脑线上查到秒杀 多花一千块惊呆在线客服
- 19999元!Redmi MAX 100英寸电视0点启动预售
- 拿下四连冠Steam新销量榜新鲜出炉第一又双叒叕是SteamDeck
- Intel独自显卡挑战轻薄本 功耗35-50W 目标直指RTX 2050
- 3499 元起 联想小新 24 27 一体机锐龙版出售
- 惠普 Envy Inspire 7900e 一款远途工作打印机!
- 苹果macOS12.3 开发者预览版 测版 Beta 5 公布