2026/1/16 13:53:03
网站建设
项目流程
国家电力安全网站两学一做,调用百度地图做全景的网站,做网站的快捷方式代码,乐清建站公司哪家好hash索引基于哈希表实现#xff0c;它通过哈希函数将索引键值映射到哈希表中的一个位置#xff08;桶#xff09;#xff0c;从而快速定位数据。
关键特定#xff1a;
等级查询#xff1a;只支持等值查询#xff08;#xff09;#xff0c;不支持范围查询#xff08;…hash索引基于哈希表实现它通过哈希函数将索引键值映射到哈希表中的一个位置桶从而快速定位数据。关键特定等级查询只支持等值查询不支持范围查询,,between等。快速查找在理想情况下哈希索引的查找时间复杂度为O1。内存友好哈希索引通常更小可以更多地存储在内存中。冲突处理适用链地址法每个桶是一个链表处理哈希冲突。hash索引的工作原理基本结构hash索引将数据存储在一个固定数量的桶bucket中每个桶包含一个指向实际数据行的指针链表。Hash索引结构 ┌─────────────────────────────────────────┐ │ 桶0: [指针1 - 指针2 - ...] │ │ 桶1: [指针3 - 指针4 - ...] │ │ ... │ │ 桶N-1: [指针...] │ └─────────────────────────────────────────┘hash函数postgresql适用内部定义的hash函数例如对于整数、文本等类型都有对应的哈希函数将键值转换为一个32位的哈希码。然后通过取模运算确定桶的位置。bucket_index hash_code % num_buckets工作流程插入流程1、对索引键值应用哈希函数取得哈希码。 2、根据哈希码和桶的数量计算出桶的索引。 3、将新的元组行的TID元组ID添加到该桶的链表中。查询流程等值查询1、对查询键值应用相同的哈希函数得到哈希码。 2、计算桶索引。 3、遍历该桶中的链表比较键值是否相等因为可能有哈希冲突。 4、返回所有匹配的TID。hash索引的内部原理1、初始桶数量创建hash索引时初始桶的数量为2并且随着数据的插入桶的数量会动态增长。2、分裂与合并当每个桶的平均元素数量超过一定阈值时postgresql会触发桶的分裂即增加桶的数量通常是翻倍并重新哈希分布元素。相反如果删除很多数据可能会合并桶。3、哈希函数postgresql为每种数据类型提供了特定的哈希函数 确保尽可能均匀地分布数据。适用场景hash索引最适用于等职查询尤其时当查询条件非常精确时。创建hash索引 create index idx_hash on table using hash (column); 等值查询 select * from table where columnvalue;由于hash索引通常比b-tree索引小因此在内存受限的环境中hash索引可能更有效。如果查询模式时随机的等值查询而不是顺序或范围查询hash索引可能比b-tree索引更快。优势等值查询速度快在无冲突的情况下时间复杂度为O(1)。索引结构紧凑通常为B-tree索引占用更少的空间。适用于高基数列对于有大量唯一值的列hash索引可能更有效。劣势仅支持等值查询不支持范围查询、排序等。哈希冲突冲突会降低性能最坏情况退化为链表查询O(n)。无顺序性不能用于order by操作。不支持多列索引postgresql的hash索引目前只支持单列但可以通过表达式索引实现多列的效果。重建成本高当桶数量需要调整时需要重新hash所有元素成本较高。哈希冲突 这是计算机科学中一个基础且重要的概念。哈希冲突也叫哈希碰撞是指两个不同的输入或键经过同一个哈希函数计算后得到了相同的哈希值。 哈希函数定义一个哈希函数H将任意大小的数据映射到固定大小的值哈希值。 鸽巢原理抽屉原理如果输入空间大于输出空间(通常都是这样)那么必然存在至少两个不同的输入对应同一个输出。例如哈希函数输出的时32为整数只有2^32种可能但输入可能时无限多的字符串。所以冲突不可避免。 哈希冲突会导致一些问题特别是在哈希表这种数据结构中 1、数据丢失如果哈希表不处理冲突后来的键值对可能会覆盖之前的。 2、性能下降冲突会使得哈希表的查找、插入操作退化为线性搜索。 3、安全问题恶意攻击者可能利用冲突进行拒绝服务攻击如hash Dos 解决哈希冲突的方法 主要有两类方法开放寻址法和链地址法。 1、开放寻址法open addressing 核心思想当发生冲突时按照某种检测序列在哈希表中寻找下一个空闲位置。 2、链地址法separate chaining 核心思想每个哈希桶bucket存储一个链表或其他数据结构所有映射到同一位置的元素都放在这个链表中。性能调优1、调整桶数量通过maintenance_work_mem间接影响 2、监控冲突 select tablenameattnamenull_frac,avg_width,n_distinct,most_common_vals,most_common_freqs from pg_stats where tablenametable_name and attnamecolumn_name; 3、重建索引 reindex index idx_hash;