建索引语句
执行计划
但是如果将查询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编码
以上为个人经验,希望能给大家一个参考,也希望大家多多支持七叶笔记。如有错误或未考虑完全的地方,望不吝赐教。