数据库索引原理与优化:从B+Tree到向量索引的完整指南
文章最后更新时间: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 | 注意最左前缀 |
| 精确匹配(如邮箱) | Hash | O(1)查找 |
| 范围查询 | B+Tree | Hash不支持 |
| 全文搜索 | GIN/GiST | 倒排索引 |
| 语义搜索 | 向量索引(HNSW) | ANN近似搜索 |
| 地理空间 | GiST(R-tree) | 空间索引 |
没有一种索引是万能的。理解你的查询模式,然后在正确的位置建立正确的索引——这是数据库优化的核心艺术。
文章版权声明:除非注明,否则均为极派博客原创文章,转载或复制请以超链接形式并注明出处。

