绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
PostgreSQL索引使用的一些技巧
2020-05-08 10:19:09

PG数据库这些年的技术发展确实也十分迅速,其易用性,性能,稳定性都已经达到了在我们生产环境应用的需要。实际上大多数数据库在总体原理上是大同小异的,所以如果你掌握了其他数据库,要学习PG也不是太难的事情。老白这两年也在使用PG数据库,我们的D-SMART系列产品的后台数据库系统就选择了PG 10.3。

闲话少说,我们直入主题,谈谈PG数据库的索引。主要的PG索引也是B-TREE索引这一点是和ORACLE类似的。关于B-TREE索引的一般性问题我就不多分析了。这里讲几个特殊的地方。

(1) 升序降序NULL记录的位置:一个索引是升序降序可以通过ASC/DESC定义来制定,不过NULL记录所在的位置,PG是可以制定的,缺省情况下的升降序是ASC NULLs LAST,也就是说索引是升序的,NULL记录会放在索引的尾部。我们可以通过NULLs FIRST来调整NULL记录放在索引的位置。这对于经常要扫描NULL记录的应用是有帮助的。

create index emp_idx on emp( emp_stat nulls first);

(2)部分索引(Partial index):只对部分行建立索引,从而减少索引的大小,提高访问性能

create index emp_idx on emp(emp_stat ) where emp_stat is null;

(3)表达式索引/函数索引:和Oracle类似

(4)附加字段索引:大家还记得Oracle数据库的索引扫描吗,如果查询所需要的字段在索引中都存在了,就不需要访问表了,直接访问索引就行了。这种情况下,我们需要给索引增加字段。PG的附加字段索引就是这种索引的改进型。

create index emp_idx on emp(emp_id) include (emp_name);

这时候如果我们select emp_id,emp_name …,就直接可以通过索引解决了。而且这里索引字段只有emp_id,emp_name不需要排序,这样就节约了复合索引的开销

(5)%匹配操作的索引:Oracle的索引是支持%通配符的,如果%是在尾部,索引是可以直接起作用的,不过在PG里这里还有点小差别。如果我们执行:

select emp_id from emp where emp_name like 'jackson%';

普通的

create index emp_idx on emp(emp_name)

是无法起作用的。需要创建一个通配符专用的索引:

create index emp_idx on emp(emp_name varchar_pattern_ops);

这样上面的操作就可以使用索引了。不过这种索引不支持><等操作,如果需要适应两种情况,那么我们就必须创建两个索引了。

当然如果我们使用反转键索引,那么就可以支持'%jackson'通配符了:

create index emp_idx on emp(reverse(emp_name) varchar_pattern_ops);

PG这些小心思还是挺有效的,如果我们在使用PG数据库,不把这么好的功能用上,是不是有点可惜呢。

本文转载自公众号<白鳝的洞穴>

分享好友

分享这个小栈给你的朋友们,一起进步吧。

华山论剑
创建时间:2019-02-22 18:53:00
没了烟火气,人生就是一段孤独的旅程·····于是,在ITPUB,我们以武论英雄!
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

栈主、嘉宾

查看更多
  • 栈栈
    栈主
  • ?
    嘉宾

小栈成员

查看更多
  • u_9a3ed7a37f8e4a
  • daisyplay
  • boss_ch
  • Jack2k
戳我,来吐槽~