构建 SaarDB 第 8 部分:二级索引
来源:dev.to — 2026-08-22
📋 概述
在上一部分实现主键查找与全表扫描之后,作者开始给这个 Go 数据库 SaarDB 加二级索引。先指出"索引值→主键列表"的暴力方案的三宗罪:写入变慢(读-改-写循环)、并发热点键、值膨胀(空间放大)。正确做法是为每个(列值, 行)分配独立键,键格式 index:<表>:<列>:<值>:<主键>,且列值必须排在主键前以保证前缀扫描的排序相邻性。进一步介绍复合索引(支持最左前缀规则)、索引覆盖扫描(index-only scan,避免随机 GET),并用 M1 Pro 基准展示高基数 1 万行时约 903 倍加速,同时也说明当查询命中大比例行时全表扫描反而更快。
🔑 核心要点
- 暴力二级索引(索引值→主键列表)有写慢、热点键、空间放大三大问题。
- 正解:每(列值,行)一个键,格式 index:<表>:<列>:<值>:<主键>。
- 列值须排在主键前,才能保证前缀扫描的排序相邻性。
- 复合索引支持最左前缀规则:前缀列可作为独立索引,但不可跳过中间列。
- 高基数 1 万行基准:带索引 12ms vs 无索引 10.9s,约 903 倍加速。
- 当查询返回表的大比例行时,全表扫描反而比索引扫描更快。
💡 金句
我们如何设计键来保证那种相邻性,这才是全部问题所在。
👍 0
👎 0
← 返回 dev.to 首页