为何保证测试效果更直观,我们使用随机数据填充一下该表
至此,虚拟数据创建完毕。
简单LIKE语句查询:
结论:LIKE查询没有走索引 创建普通索引: testdb01=# create index idx_testliketb01_username on testliketb01(username); CREATE INDEX 执行三遍:analyze testliketb01 ; 重新执行LIKE语句,发现还是没有走索引 创建包含operator class的索引: testdb01=# create index idx_testliketb01_username on testliketb01(username varchar_pattern_ops); CREATE INDEX 执行三遍:analyze testliketb01 ;
结论:在创建完普通索引并收集统计信息后数据库在执行LIKE语句时有可能仍然无法使用索引。在创建完带有操作类的索引收集完统计信息后,执行LIKE语句可以看到正常使用索引,且执行效率有了不小提升。
PS:operator class是Postgresql新版中创建索引的新选项,旨在通过制定索引的操作类可以更精准的收集统计信息。
为了更精准的收集统计信息,我们也可以在初始化或者创建数据库时将Collate设置为"C",这也是Postgresql数据中常用的优化手段。 我们来测试一下将Collate设置为"C"的效果:
结论:创建数据库时将Collate设置为"C",即便索引为普通索引,LIKE语句也可以使用索引提升查询效率。
优化建议:1、初始化数据库或者创建数据库时将Collate设置为"C"。
2、创建索引时指定索引的操作类。(text_pattern_ops、varchar_pattern_ops和 bpchar_pattern_ops分别支持类型text、varchar和 char上的B-tree索引)
3、优化思路,对于%X的列无法使用索引,可以新增一列 反存储列,将%X改为X%。
4、创建覆盖索引,保证复杂SQL中可以尽可能调用该索引。
5、调整业务逻辑,尽量不用LIKE语句或者调整LIKE语句在WHERE中的位置。
到此这篇关于PostgreSQL数据库中如何保证LIKE语句的效率的文章就介绍到这了,更多相关PostgreSQL保证LIKE语句的效率内容请搜索七叶笔记以前的文章或继续浏览下面的相关文章希望大家以后多多支持七叶笔记!