标准答案

  1. B-tree 适合等值、范围、排序和可利用前缀的匹配,是普通标量字段的默认选择,但选择率低或结果集很大时仍可能不如顺序扫描。
  2. GIN 通过倒排结构支持数组、全文和 JSONB 多值包含,查询可能很快,但索引体积、构建时间和更新写放大通常高于简单 B-tree。
  3. GiST 是可扩展的搜索框架,常用于范围、几何和相似关系;具体效果取决于操作符类和数据分布,不能把 GiST 当成另一种通用 B-tree。
  4. BRIN 保存数据块范围摘要,适合时间或递增 ID 与物理存储顺序高度相关的大表;如果数据随机分布,摘要无法有效缩小扫描范围。
  5. 选型要用真实 SQL、操作符、数据分布、写入频率和 EXPLAIN 验证,同时计算索引占用的内存、磁盘、VACUUM 和写入成本。

题目解析

索引不是数据库里的“加速开关”,而是为某类访问路径预付存储和写入成本。一个只读的检索表和一个高频写入的订单表,合理索引数量可能完全不同。

规划器是否使用索引还要看估算成本、返回行数、缓存命中和随机 I/O。即使索引定义正确,扫描大部分表时顺序读取也可能更便宜。

面试中可以用一个查询说明选择过程:先看过滤/排序操作符,再看数据是否有物理相关性,最后用计划和压测验证,而不是背索引类型的关键词。

常见误区

  • 误区:所有字段都建 B-tree。改正:索引必须服务于真实查询,低频字段和高写入表要先计算收益与写放大。
  • 误区:认为 GIN 只要查询快就值得建立。改正:同时评估索引体积、更新成本、构建窗口和内存命中。
  • 误区:认为有索引就一定走索引。改正:计划由选择率、统计信息、缓存和成本模型决定,必须用 EXPLAIN 验证。

作者信息