详细解释哈希在postgresql索引中的使用
  • 作者:admin
  • 发表时间:2021-04-29 07:52
  • 来源:未知

本文主要介绍hash在postgresql索引中的使用的详细说明,有很好的参考价值,希望对大家有所帮助。来和边肖一起看看。

os: ubuntu 16.04

postgresql: 9.6.8

知识产权规划

192.168.56.102节点2 postgresql

帮助创建索引

postgres=# \h创建索引

Command:创建索引

描述:定义新索引

语法:

在表名[使用方法]上创建[唯一]索引[并发] [ [如果不存在]名称]

({ column _ name |(expression)}[COLLATE排序规则][op class][ASC | desc][NULLS { FIRSt | LAST }][,] )

[ WITH (storage_parameter=value [,] ) ]

[表空间_名称]

[ WHERE谓词]

[使用方法]

方法

要使用的索引方法的名称。你可以选择btree,hash,gist,spgist,gin和brin。默认方法是btree。

切碎

哈希只能处理简单的等价比较,

postgres=# drop table tmp _ t0

翻桌

postgres=# create table tmp _ t0(c0 varchar(100),C1 varchar(100));

创建表格

postgres=# insert into tmp_t0(c0,c1)从generate_series(1,100000)中选择MD5(id :3360 varchar)、MD5((id): varchar)作为id;

插入0 100000

postgres=#使用hash(c0)在tmp_t0上创建索引idx _ tmp _ t0 _ 1;

创建索引

postgres=# \d tmp_t0

表“public.tmp_t0”

列|类型|排序规则|可空|默认|存储|统计目标|描述

- - - - - - - -

c0 |字符变化(100) | | | |扩展| |

c1 |字符变化(100) | | | |扩展| |

索引:

idx_tmp_t0_1 '哈希(c0)

postgres=# explain select * from tmp _ t0,其中c0=' d3d 9446802 a 44259755d 38 E6 d 163 e 820 ';

查询计划

-

在tmp_t0上使用idx_tmp_t0_1进行索引扫描(成本=0.00.8.02行=1宽度=66)

索引Cond :((c0):3360 text=' d3d 9446802 a 44259755d 38 E6 d 163 e 820 ' : text)

(2行)

注意事项,官网特别强调:

散列索引操作目前不被WAL记录,所以有未写的修改。数据库崩溃后,需要用REINDEX命令重建哈希索引。

同样,初始基本备份完成后,对哈希索引的更改不会通过流式或基于文件的复制进行复制,因此它们会对以后使用它们的查询给出错误的答案。

由于这些原因,不再建议使用哈希索引。

补充:Postgresql哈希索引简介

哈希索引的结构

当数据被插入到索引中时,我们将通过哈希函数为这个索引键计算一个值。PostgreSQL中的Hash函数总是返回“整数”的类型,范围是2 ^ 3240亿。桶的数量最初是两个,然后动态增加以适应数据大小。可以使用位算法从散列码计算桶号。这个桶可以存放TID。