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

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

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

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