数据库索引原理与优化:从B+Tree到向量索引的完整指南

昨天 8阅读

文章最后更新时间:2026年05月04日

索引用得好,查询时间从30秒降到30毫秒;用得不好,反而拖累写入性能。本文从底层原理出发,覆盖传统数据库索引和AI时代的向量索引两大领域,帮助你真正理解索引的工作机制。

一、B+Tree:关系型数据库的基石

B+Tree是MySQL InnoDB和PostgreSQL的默认索引结构。理解它的工作原理是优化SQL查询的基础。

B+Tree的结构特点

  • 所有数据存储在叶子节点:非叶子节点只存键值用于导航
  • 叶子节点形成有序链表:支持高效的范围查询(WHERE id BETWEEN 100 AND 200)
  • 树的高度保持平衡:所有叶子节点深度相同,查找操作的时间复杂度为O(log n)
  • 每个节点存储多个键值:减少磁盘I/O次数(通常一个节点=一个磁盘页=16KB)

索引优化实战

-- 错误:函数包裹索引列
SELECT * FROM users WHERE YEAR(created_at) = 2026;
-- 正确:使用范围查询
SELECT * FROM users WHERE created_at >= '2026-01-01' AND created_at < '2027-01-01';

-- 错误:联合索引顺序不对
CREATE INDEX idx_a_b ON orders(user_id, status);  -- ❌
SELECT * FROM orders WHERE status = 'paid';  -- 索引失效!
-- 正确:遵循最左前缀原则
CREATE INDEX idx_b_a ON orders(status, user_id);

最左前缀原则:联合索引(a, b, c)支持查询a、a+b、a+b+c,但不支持b或b+c。这就是为什么索引列的顺序至关重要。

二、Hash索引:等值查询的极致优化

Hash索引的查找时间复杂度是O(1),比B+Tree的O(log n)更快,但不支持范围查询和排序。适合精确匹配场景(WHERE id = 123或WHERE email = 'user@example.com')。

PostgreSQL的Hash索引在PG 10+版本后性能大幅提升,在等值查询场景下比B+Tree快20-30%。

三、倒排索引:全文搜索的秘密

Elasticsearch和PostgreSQL的GIN索引使用倒排索引结构。它将文档内容分词后,建立「词语→文档列表」的映射:

文档1: "Python异步编程完全指南"
文档2: "Python机器学习入门"
文档3: "Rust异步编程教程"

倒排索引:
"Python" → [文档1, 文档2]
"异步" → [文档1, 文档3]
"编程" → [文档1, 文档2, 文档3]
"完全" → [文档1]
"指南" → [文档1]

四、向量索引:AI时代的新需求

向量数据库(Pinecone、Qdrant、Milvus、pgvector)使用了与传统索引完全不同的技术:

ANN(近似最近邻搜索)

在高维空间(通常384-1536维)中精确搜索最近邻的计算成本极高(O(n*d))。ANN算法牺牲微小的精度换取巨大的速度提升:

  • HNSW(分层可导航小世界图):当前综合性能最好的ANN算法,在百万级向量上仍能保持亚毫秒级查询延迟
  • IVF(倒排文件索引):将向量空间划分为簇,查询时只搜索最相关的几个簇
  • PQ(乘积量化):将高维向量压缩为短编码,大幅减少存储和计算开销

pgvector实战

-- 创建向量列(1536维OpenAI embedding)
CREATE TABLE documents (
    id SERIAL PRIMARY KEY,
    content TEXT,
    embedding vector(1536)
);

-- 创建IVFFlat索引
CREATE INDEX ON documents 
USING ivfflat (embedding vector_cosine_ops) 
WITH (lists = 100);

-- 相似度搜索
SELECT content, 1 - (embedding <=> $1) AS similarity
FROM documents
ORDER BY embedding <=> $1
LIMIT 10;

五、索引选择的决策框架

场景推荐索引原因
主键/外键查询B+Tree通用且高效
多列条件查询联合B+Tree注意最左前缀
精确匹配(如邮箱)HashO(1)查找
范围查询B+TreeHash不支持
全文搜索GIN/GiST倒排索引
语义搜索向量索引(HNSW)ANN近似搜索
地理空间GiST(R-tree)空间索引

没有一种索引是万能的。理解你的查询模式,然后在正确的位置建立正确的索引——这是数据库优化的核心艺术。

文章版权声明:除非注明,否则均为极派博客原创文章,转载或复制请以超链接形式并注明出处。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码