PG中使用索引进行模糊查询
现在数据库中存在一个tb_user(id, name,age)
表,并且已经针对name
字段创建了索引tb_user_name_idx
。
1. 模糊查询没有使用索引
正常情况下,执行如下SQL语句:
explain analyze select * from tb_user where name like '%aaa%';
发现该SQL语句在name
字段上使用的是Seq Scan
而不是Index Scan或Bitmap Heap Scan
,执行时间在1s
以上。
2. 模糊查询使用索引
想要在模糊查询时在name
字段上使用索引,需要执行如下SQL语句
CREATE EXTENSION pg_trgm;
CREATE INDEX tb_user_name_trgm_gist_idx ON tb_user USING GiST(name GiST_trgm_ops);
此时,再执行:
explain analyze select * from tb_user where name like '%aaa%';
发现该SQL语句在name
字段上使用了Bitmap Heap Scan
,使用到了新创建的索引,而且执行时间减少到20-30ms
。