之前在使用PostgreSQL中的varchar类型时想当然的以为用最基本的索引创建语句创建的索引,就支持like查询的。
类似这句:

CREATE INDEX log_action_v_uri_index ON log_action (v_uri);

但是看过explain才知道,单凭这样的索引,在like搜索的时候,仍然是顺序全表扫描,如图:

后来google了一下解决方案,原来是创建索引的时候追加一下参数,应该这么创建

CREATE INDEX log_action_v_uri_index ON log_action (v_uri varchar_pattern_ops);

然后对同样的语句再次explain结果如下:

可以看到,已经命中索引了。
这其中涉及到一个重要的知识点,就是PostgreSQL的索引操作符类 ,其标准语法为

CREATE INDEX name ON table (column opclass [sort options] [, ...]);

这个opclass可以针对不同的数据类型和查询方式提供多种多样的方案,

可以看到光btree索引有关的操作符类就非常多,有些is_defaulttrue也就是正好列类型吻合的话,这个操作符类就不要特意说明了。而varchar或者text的默认用的是text_ops,它支持的查询方式仅有

所以想用模糊查询的话,还是得用text_pattern_ops或者varchar_pattern_ops(这哥俩是一个东西),它支持正则模糊匹配,也支持like %的方式