PostGreSQL不一样索引类型(btree & hash)的性能问题

在关系型数据库调优中,查询语句涉及到的索引类型是不得不考虑的一个问题。不一样的类型的索引可能会适用不一样类型的业务场景。这里咱们所说的索引类型指的是访问方法(Access Method),至于从其余维度区分索引(Index)这里暂不做考虑。sql

PostGreSQL数据库默认的索引访问方法是btree,其余的数据库如Oracle默认也是btree。那么btree究竟是何方神圣呢?若是想要深刻理解btree的运行原理,须要了解一下数据结构相关的知识,特别是树形数据结构。btree运用了b+ 树数据结构,其能够有效节省IO操做,在查询时能够提供查询效率。数据库


Screen Shot 2020-09-27 at 23.25.15.png

    咱们沿用以前文章用过的查询语句来作测试,其中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;

 那么执行计划的细节以下图所示:app

Screen Shot 2020-09-27 at 23.26.56.png

下面将在一样的表字段上,删除原来的索引,添加相应的hash索引。添加语句为:
ide

CREATE INDEX index_sort_test_salary_hash    ON public.sort_test USING hash    (salary)    TABLESPACE pg_default;

添加完以后,以下图所示:性能

Screen Shot 2020-09-27 at 23.27.51.png

一样的查询语句的执行计划是怎样的呢?以下图:测试

Screen Shot 2020-09-27 at 23.28.20.png


能够发现0.757 ms  vs. 0.022 ms仍是有数量级的差异,在这种状况下,hash索引的效率比btree的效率要高不少。因为hash索引结构的特殊性,其检索效率很是高,能够一步到位。而通常使用的B-tree索引须要从根节点->枝节点->页节点。因此从工做模式上看,hash索引的效率要比btree索引要高。
spa

可是咱们你们都懂的,事务都有两面性,hash索引有必定的限制和弊端,要否则这些经常使用的数据库如Oracle, MySQL,PostGreSQL等也不会将btree access method设置为默认选项了。具体有以下2点限制:3d

  • Hash索引只能知足"=","IN"等,等值查询,不能使用范围查询。code

  • 在使用部分索引键查询的时候,hash索引将不起做用。


因此在应用不一样的索引类型时,要充分考虑具体的业务场景和实际状况,才能获得更优解。

你们也能够扫描并关注以下公众号“TimTest”,会有更多性能测试相关内容分享。

qrcode_for_gh_39009e949117_258-1.jpg

相关文章
相关标签/搜索