为什么 Postgres 不使用我的杜松子酒索引?

Why isn't Postgres using my gin index?

有了这个table:

=> \d "user"
                                          Table "public.user"
        Column        |            Type             |                     Modifiers                     
----------------------+-----------------------------+---------------------------------------------------
 id                   | integer                     | not null default nextval('user_id_seq'::regclass)
 email                | character varying(255)      | 
Indexes:
    "user_pkey" PRIMARY KEY, btree (id)
    "user_email_key" UNIQUE CONSTRAINT, btree (email)
    "user_email_idx" gin (email gin_trgm_ops)

此查询未使用 gin 索引:

=> explain select email from "user" where email ilike '%j%';
                          QUERY PLAN                          
--------------------------------------------------------------
 Seq Scan on "user"  (cost=0.00..3986.42 rows=11886 width=22)
   Filter: ((email)::text ~~* '%j%'::text)
(2 rows)

为什么?

https://hashrocket.com/blog/posts/exploring-postgres-gin-index

注意事项 这种方法的唯一缺点是输入查询必须至少有 3 个字母,因为 Postgres 需要能够从输入查询中提取至少一个三元组才能使用我们的三元组索引。

因为您实际上并没有使用三元组索引或您的 postgres < 9.1 版本。

select email from "user" where similarity(email, 'xyz@gmail.com') > 0.5;

其中 0.5 是您的阈值,0-完全不同,1-完全匹配

UPD:考虑你给1个字符作为匹配项,因为一个符号可以匹配很多文档,它可能表现不佳