引言

在数据库性能调优领域,索引是最重要的优化手段之一。一条慢查询从几秒优化到几毫秒,往往是索引的功劳。然而,很多开发者对索引的理解仅停留在"加索引加速查询"的表象上,深入到底层数据结构、查询计划选择、索引类型适用场景时便语焉不详。本文将从 PostgreSQL 索引的底层原理出发,系统讲解 B-Tree、GiST、GIN、BRIN 四大索引类型的工作机制,再延伸到查询计划分析与实战优化策略,帮助读者建立完整的索引知识体系。

一、为什么需要索引?顺序扫描的代价

在没有索引的情况下,PostgreSQL 对表的查询只能进行全表扫描(Sequential Scan),即逐行读取整个表数据,然后在内存中过滤匹配行。假设一张订单表有 1000 万行数据,即使只查询一行记录,全表扫描也需要读取全部数据页。按每页 8KB、每行 200 字节计算,大约需要读取 10 万页(约 800MB 磁盘 I/O),这种代价在大数据量场景下是不可接受的。

索引的本质是空间换时间:通过维护一个额外的有序数据结构,让查询从 O(N) 降低到 O(log N) 或更低。PostgreSQL 的索引是表的附属结构,不改变表本身的物理存储顺序(堆表),而是在索引中维护从键值到堆元组(ctid)的映射。

二、B-Tree 索引:万金油索引

2.1 数据结构

B-Tree(严格来说是 B Tree)是 PostgreSQL 默认的索引类型。它是一棵平衡多路查找树,具有以下特点:

  • 所有叶子节点都在同一层(平衡性保证)
  • 叶子节点之间通过双向链表连接(支持高效的范围扫描)
  • 每个内部节点包含多个键和指针,扇出率高(通常几百),树高度很低

对于 1000 万行数据,B-Tree 高度通常在 3-4 层,意味着任何查询最多只需 3-4 次 I/O 即可定位到目标行的 ctid。

2.2 适用场景

B-Tree 是 PostgreSQL 中用途最广的索引类型,支持以下操作符:

  • =,
点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部