• CMU15-445 数据库系统播客:适用于数据库的经典哈希结构与设计权衡

CMU15-445 数据库系统播客:适用于数据库的经典哈希结构与设计权衡

2025-08-16 12:32:51 栏目:宝塔面板 93 阅读

速度与碰撞的权衡 (Trade-off between Speed and Collision Rate)

不使用加密哈希函数,我们只关注 速度快 和 碰撞率低 的哈希函数。

常数因子很重要 (Constant Factors Matter) :在处理大量数据时,即使O(1)操作的常数因子差异也会导致巨大的性能差距和金钱成本。

• 静态哈希方案 (Static Hashing Schemes):静态哈希方案的哈希表大小是固定的。如果存储空间不足,DBMS必须从头开始重建一个更大的哈希表(通常是原大小的两倍),这会 非常昂贵 。

线性探测哈希 (Linear Probe Hashing)

实现原理/方法 :哈希函数计算出槽位后,如果该槽位已被占用,则 线性扫描 到下一个空闲槽位进行插入。查找时,也从哈希到的槽位开始线性扫描,直到找到目标键或遇到空槽。为了进行验证,每个槽位必须存储原始键。

• 优点 : 最基本也通常是最快 的哈希方案,因为它具有良好的缓存局部性,且分支预测失败较少。

• 代价 :删除操作很复杂。如果直接删除,会中断后续键的查找链; 墓碑标记 (Tombstone) 复杂,在删除的槽位放置一个“墓碑”标记,表示该槽位逻辑上为空但物理上占用,查找时会跳过此标记继续扫描。浪费空间,需要后续垃圾回收。将后续的键向前移动以填充空位,代价是移动后的键可能不再位于其最佳哈希位置的下游,导致查找失败。

罗宾汉哈希 (Robin Hood Hashing)

实现原理/方法 :线性探测哈希的一种变体。每个键都会记录它 距离其理想哈希位置的“跳跃”次数 (即贫富程度)。在插入时,如果新键比当前占据该槽位的键“更贫穷”(即距离其理想位置更远),新键会 “偷走” 这个槽位,而被“偷走”的键则会被重新插入到哈希表中。

• 优点 :旨在 平衡整个哈希表中键的距离 ,最小化任何键距离其理想位置的最大距离。

• 代价 : 写入/插入更昂贵 ,在实践中,对于内存中的数据结构,通常 比线性探测哈希慢 。

布谷鸟哈希 (Cuckoo Hashing)

实现原理/方法 :使用 多个哈希表 (通常是两个)和 不同的哈希函数种子 。插入时,尝试在每个哈希表中找到一个空闲槽位。如果所有可能的槽位都被占用,则 驱逐 其中一个哈希表中的现有元素,并将其重新哈希以找到新位置,这可能导致连锁驱逐(像布谷鸟占巢)。

• 优点 : 查找和删除总是O(1) ,因为只需检查每个哈希表中的一个特定位置。

• 代价 : 插入可能昂贵 ,可能导致“乒乓”效应或连锁驱逐,甚至陷入 循环 (无限循环);如果检测到循环或哈希表变得太满,就需要 重建所有哈希表 ,使用新的哈希函数种子或更大的表。

• 动态哈希方案 (Dynamic Hashing Schemes),能够在需要时 按需调整大小 ,而无需重建整个哈希表。

链式哈希 (Chained Hashing / Bucket Hashing)

实现原理/方法 :每个主槽位都维护一个 桶(bucket)的链表 。所有哈希到同一个槽位的键都放在该链表的桶中。当桶满时,就 分配并链接一个新的桶 。

• 优点 :实现简单,且通过不断添加新桶可以“无限”增长。易于实现线程安全,只需对槽位或单个页面进行加锁。

• 代价 :如果所有键都映射到同一个桶链,哈希表可能会退化为 O(n)的线性搜索 ,性能显著下降;可能存在空间浪费,尤其是有许多短链时。

可扩展哈希 (Extendible Hashing)

实现原理/方法 :链式哈希的改进变体,它会 分裂桶 而不是让链无限增长。维护一个 全局计数器(global depth) ,指示哈希值需要检查的位数,以确定在槽数组中的位置。

每个桶也有一个 局部计数器(local depth) 。

当桶溢出时,会触发分裂。如果局部深度小于全局深度,则重新分配桶中的元素到新的桶中。如果局部深度等于全局深度,则 全局深度会增加,槽数组的大小会加倍 (这个操作是廉价的,因为只是指针数组),然后重新分配桶中的元素。

• 优点 : 数据移动被局部化 到溢出的桶链,其他桶不受影响。槽数组的加倍操作相对廉价,因为它只涉及指针数组的更新,不涉及数据的物理移动。

• 代价 :槽数组加倍时,需要对整个槽数组 获取全局锁 ,这可能成为并发访问的瓶颈;删除操作比较复杂,可能需要合并桶并逆向分裂过程

线性哈希 (Linear Hashing)

实现原理/方法 :维护一个 分裂指针 (split pointer) ,它跟踪下一个要分裂的桶,而不管哪个桶实际溢出。使用 多个哈希函数 (例如 key % n 和 key % 2n)。

当任何桶溢出时, 分裂指针指向的桶 会被分裂(即使它不是溢出的那个),将其内容重新分配到新的槽位,并添加一个新的哈希函数(key % 2n)。

查询时,首先使用第一个哈希函数。如果映射到的槽位在分裂指针 之上 (即已被分裂),则需要使用第二个哈希函数来找到实际位置。

• 优点 :将 调整大小的操作局部化 到分裂指针所指向的桶,避免了对整个哈希表进行全局加锁,从而减少了并发瓶颈。

• 代价 :由于分裂的桶不一定是溢出的桶,这可能导致 临时出现更多的溢出链 ;删除操作很复杂,可能涉及分裂指针的逆向移动和内存回收。

• 线性探测哈希 (Linear Probe Hashing)


本文地址:https://www.yitenyun.com/328.html

搜索文章

Tags

数据库 API FastAPI Calcite 电商系统 MySQL Web 应用 异步数据库 数据同步 ACK 双主架构 循环复制 TIME_WAIT 运维 负载均衡 服务器 管理口 JumpServer SSL 堡垒机 跳板机 HTTPS HexHub Docker 服务器性能 JumpServer安装 堡垒机安装 Linux安装JumpServer SQL 查询 Deepseek 宝塔面板 Linux宝塔 生命周期 esxi esxi6 root密码不对 无法登录 web无法登录 序列 核心机制 锁机制 Windows Windows server net3.5 .NET 安装出错 行业 趋势 HTTPS加密 开源 PostgreSQL 存储引擎 Windows宝塔 Mysql重置密码 宝塔面板打不开 宝塔面板无法访问 查看硬件 Linux查看硬件 Linux查看CPU Linux查看内存 机器学习 Redis Undo Log 机制 Oracle 处理机制 Spring 动态查询 无法访问宝塔面板 响应模型 优化 万能公式 InnoDB 数据库锁 异步化 连接控制 Serverless 无服务器 语言 监控 ES 协同 工具 group by 索引 openHalo Postgres OTel Iceberg 技术 高可用 缓存方案 缓存架构 缓存穿透 分页查询 scp Linux的scp怎么用 scp上传 scp下载 scp命令 存储 SVM Embedding 国产数据库 GreatSQL 连接数 数据 主库 日志文件 MIXED 3 Linux 安全 R edis 线程 R2DBC SQLite-Web SQLite 数据库管理工具 Netstat Linux 服务器 端口 加密 场景 OB 单机版 Recursive 启动故障 防火墙 黑客 云原生 RocketMQ 长轮询 配置 ​Redis 推荐模型 SQLark 自定义序列化 AI 助手 向量数据库 大模型 共享锁 PG DBA Canal 信息化 智能运维 Hash 字段 不宕机 Rsync Python 向量库 Milvus 同城 双活 Ftp 磁盘架构 电商 系统 业务 IT运维 分库 分表 架构 修改DNS Centos7如何修改DNS 语句 聚簇 非聚簇 PostGIS 传统数据库 向量化 filelock 数据分类 频繁 Codis 线上 库存 预扣 MongoDB 数据结构 MVCC 流量 缓存 失效 • 索引 • 数据库 redo log 重做日志 MCP 开放协议 MySQL 9.3 mini-redis INCR指令 Web 接口 开发 数据类型 sftp 服务器 参数 人工智能 推荐系统 千万级 大表 ZODB 工具链 Doris SeaTunnel 分布式架构 分布式锁​ Redisson 锁芯 聚簇索引 非聚簇索引 EasyExcel MySQL8 INSERT 数据备份 高效统计 今天这篇文章就跟大家 prometheus Alert 窗口 函数 虚拟服务器 虚拟机 内存 事务 Java 主从复制 代理 容器 崖山 新版本 COMPACT 发件箱模式 SSH 网络架构 网络配置 分页 引擎 性能 Web RDB AOF MGR 分布式集群 数据脱敏 加密算法 网络故障 核心架构 订阅机制 容器化 QPS 高并发 B+Tree ID 字段 播客 分布式 集中式 数据页 Redis 8.0 数据集成工具 读写 速度 服务器中毒 Go 数据库迁移 自动重启 OAuth2 Token Redka 模型 SpringAI StarRocks 数据仓库 微软 SQL Server AI功能 DBMS 管理系统 Entity 排行榜 排序 池化技术 连接池 Valkey Valkey8.0 JOIN 关系数据库 Caffeine CP 原子性 事务隔离 业务场景 LRU Weaviate 数据字典 兼容性 部署 Testcloud 云端自动化 网络 dbt 数据转换工具 分页方案 排版 Pottery 1 ReadView 事务同步 优化器 sqlmock 日志 AIOPS UUID ID InfluxDB 悲观锁 乐观锁 意向锁 记录锁 单点故障 Pump 单线程 UUIDv7 主键 仪表盘 Ansible 对象 Order 编程 Crash 代码 RAG HelixDB 分布式锁 Zookeeper 产业链 字典 双引擎 IT 恢复数据 订单 List 类型 拦截器 动态代理 LLM 国产 用户 线程安全 慢SQL优化 表空间 快照读 当前读 视图 解锁 调优 RR 互联网 Next-Key count(*) count(主键) 行数 神经系统 GitHub Git 矢量存储 数据库类型 AI代理 CAS 查询规划 技巧 算法 多线程 闪回 并发控制 恢复机制