Adaptive Hash Index:自适应哈希索引
Adaptive Hash Index概述 Adaptive Hash Index(AHI,自适应哈希索引) 是InnoDB的自动优化机制,在Buffer Pool上层构建哈希索引,加速等值查询。 查询流程对比: 传统B+树查询: SELECT * FROM users WHERE id = 100; → B+树查找(3-4次页访问) AHI查询: SELECT * FROM users WHERE id = 100; → Hash查找(1次内存访问) AHI的工作原理 1. 自动构建 -- InnoDB监控查询模式 SELECT * FROM users WHERE id = 1; -- 第1次 SELECT * FROM users WHERE id = 2; -- 第2次 SELECT * FROM users WHERE id = 3; -- 第3次 ... SELECT * FROM users WHERE id = 100; -- 第N次 -- 当检测到等值查询频繁访问同一索引前缀 -- InnoDB自动构建哈希索引 AHI[100] → Buffer Pool页地址 2. 哈希索引结构 B+树索引(磁盘) 10 / \ 5 15 / \ / \ 1 7 12 17 → 数据页 AHI(内存) Hash表: id=1 → 页地址0x1000 id=5 → 页地址0x1001 id=7 → 页地址0x1002 id=10 → 页地址0x1003 ... 3. 查询流程 -- 查询 SELECT * FROM users WHERE id = 100; -- 流程 1. 检查AHI是否有id=100的条目 2. ✅ 有:直接通过Hash查找,获取页地址(O(1)) 3. ❌ 没有:走B+树查找(O(log N)) AHI的优势 1. 加速等值查询 -- 等值查询(适合AHI) SELECT * FROM users WHERE id = 100; -- ✅ AHI加速 SELECT * FROM orders WHERE order_id = 1001; -- ✅ AHI加速 -- B+树查询:3-4次页访问(假设树高3) -- AHI查询:1次Hash查找(快3-4倍) 2. 减少CPU开销 -- B+树查找需要: 1. 二分查找(多次比较) 2. 页间跳转(多次指针访问) 3. 最终定位数据行 -- AHI查找需要: 1. Hash计算(一次) 2. 直接获取页地址(一次) AHI的限制 1. 只适用于等值查询 -- ✅ 适用 SELECT * FROM users WHERE id = 100; SELECT * FROM users WHERE id IN (1, 2, 3); -- ❌ 不适用 SELECT * FROM users WHERE id > 100; -- 范围查询 SELECT * FROM users WHERE id BETWEEN 1 AND 100; -- 范围查询 SELECT * FROM users WHERE name LIKE 'A%'; -- 模糊查询 2. 只针对热点数据 -- AHI只缓存频繁访问的索引前缀 -- 例如:id=100访问了1000次 → 自动加入AHI -- 而:id=999999只访问1次 → 不会加入AHI 3. 有维护开销 -- 更新/删除数据时,需要维护AHI UPDATE users SET name = 'Alice' WHERE id = 100; -- 流程: 1. 更新B+树索引 2. 更新Buffer Pool 3. 更新AHI(如果id=100在AHI中) AHI配置 1. 查看状态 -- 查看AHI开关 SHOW VARIABLES LIKE 'innodb_adaptive_hash_index'; -- ON(默认开启) -- 查看AHI分区数(MySQL 5.7+) SHOW VARIABLES LIKE 'innodb_adaptive_hash_index_parts'; -- 8(默认,减少锁竞争) 2. 开关配置 -- 关闭AHI(不推荐) SET GLOBAL innodb_adaptive_hash_index = OFF; -- 开启AHI(默认) SET GLOBAL innodb_adaptive_hash_index = ON; 注意:动态修改需要重建AHI,会短暂影响性能。 ...