PostGreSQL不同索引类型(btree & hash)的性能问题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了PostGreSQL不同索引类型(btree & hash)的性能问题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1778字,纯文字阅读大概需要3分钟。
内容图文
![PostGreSQL不同索引类型(btree & hash)的性能问题](/upload/InfoBanner/zyjiaocheng/871/f907aa881af74a119f30cdfe11f86f83.jpg)
在关系型数据库调优中,查询语句涉及到的索引类型是不得不考虑的一个问题。不同的类型的索引可能会适用不同类型的业务场景。这里我们所说的索引类型指的是访问方法(Access Method),至于从其他维度区分索引(Index)这里暂不作考虑。
PostGreSQL数据库默认的索引访问方法是btree,其他的数据库如Oracle默认也是btree。那么btree到底是何方神圣呢?如果想要深入理解btree的运行原理,需要了解一下数据结构相关的知识,特别是树形数据结构。btree运用了b+ 树数据结构,其可以有效节省IO操作,在查询时可以提供查询效率。
我们沿用之前文章用过的查询语句来做测试,其中sort_test表有500万行数据。表创建SQL和查询语句如下:
CREATE TABLE public.sort_test( id bigint NOT NULL, salary numeric NOT NULL, CONSTRAINT sort_test_pkey PRIMARY KEY (id)) TABLESPACE pg_default; explain analyze select * from public."sort_test" where salary = 101;
那么执行计划的细节如下图所示:
下面将在同样的表字段上,删除原来的索引,添加相应的hash索引。添加语句为:
CREATE INDEX index_sort_test_salary_hash ON public.sort_test USING hash (salary) TABLESPACE pg_default;
添加完之后,如下图所示:
同样的查询语句的执行计划是怎样的呢?如下图:
可以发现0.757 ms vs. 0.022
ms还是有数量级的差别,在这种情况下,hash索引的效率比btree的效率要高很多。由于hash索引结构的特殊性,其检索效率非常高,可以一步到位。而一般使用的B-tree索引需要从根节点->枝节点->页节点。所以从工作模式上看,hash索引的效率要比btree索引要高。
但是我们大家都懂的,事务都有两面性,hash索引有一定的限制和弊端,要不然这些常用的数据库如Oracle, MySQL,PostGreSQL等也不会将btree access method设置为默认选项了。具体有如下2点限制:
Hash索引只能满足"=","IN"等,等值查询,不能使用范围查询。
在使用部分索引键查询的时候,hash索引将不起作用。
所以在应用不同的索引类型时,要充分考虑具体的业务场景和实际情况,才能得到更优解。
大家也可以扫描并关注如下公众号“TimTest”,会有更多性能测试相关内容分享。
内容总结
以上是互联网集市为您收集整理的PostGreSQL不同索引类型(btree & hash)的性能问题全部内容,希望文章能够帮你解决PostGreSQL不同索引类型(btree & hash)的性能问题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。