今天在生产环境发现查询超时30秒,进APM发现脚本需要执行好几分钟,把脚本拿出来执行了一遍发现机构代码没加索引,加完索引发现还是不走索引,最后搜了一下postgresql不走索引,发现如果使用到like需要加单独的索引才行。
场景复现
查询脚本
脚本比较长,这里就写一个简单的示例
select * from policy_list where company_code like '0352%';
添加索引
发现该字段没有索引,所以添加了一个普通索引
create index policy_list_company_code_index
on policy_list (company_code);
添加操作符索引
操作符 text_pattern_ops、varchar_pattern_ops 和 bpchar_pattern_ops 分别支持类型 text、varchar 和 char 上的B树索引。它们与默认操作符类的区别是值的比较是严格按照字符进行而不是根据区域相关的排序规则。
create index policy_list_company_code_index
on policy_list (company_code varchar_pattern_ops);
再次查询发现走了索引
注意事项
请注意,如果希望涉及普通 <、<=、> 或 >= 比较的查询使用索引,则还应使用默认运算符类创建索引。此类查询不能使用 xxx _pattern_ops 运算符类。
如果涉及到使用比较索引和模糊索引两个场景,则需要添加两个索引,一个普通索引,一个操作符索引