七叶笔记 » 数据库 » postgresql 中的 like 查询优化方案

postgresql 中的 like 查询优化方案

1、未建索时执行计划: 2、btree索引

建索引语句

执行计划

但是如果将查询sql稍微改动一下,把like查询中的前置%去掉是这样的

3、gin索引

创建索引语句(postgresql要求在9.6版本及以上)

执行计划

三、结论

btree索引可以让后置% "abc%"的模糊匹配走索引,gin + gp_trgm可以让前后置% "%abc%" 走索引。但是gin 索引也有弊端,以下情况可能导致无法命中:

搜索字段少于3个字符时,不会命中索引,这是gin自身机制导致。

当搜索字段过长时,比如email检索,可能也不会命中索引,造成原因暂时未知。

补充:PostgreSQL LIKE 查询效率提升实验

一、未做索引的查询效率

作为对比,先对未索引的查询做测试

很显然都会做全表扫描

二、创建btree索引

PostgreSQL默认索引是btree

可以看到,等于、like的全匹配是用到索引的,like的模糊查询还是全表扫描

三、创建gin索引

gin_trgm索引的效果好多了

由于pg_trgm的索引是把字符串切成多个3元组,然后使用这些3元组做匹配,所以gin_trgm索引对于少于3个字符(包括汉字)的查询,只有前缀匹配会走索引

另外,还测试了btree_gin,效果和btree一样

注意:

gin_trgm要求数据库必须使用UTF-8编码

以上为个人经验,希望能给大家一个参考,也希望大家多多支持七叶笔记。如有错误或未考虑完全的地方,望不吝赐教。

相关文章