slug
type
status
date
tags
summary
category
icon
password
1. 核心定义:什么是索引?
索引(Index) 是数据库中一种专门的辅助数据结构。
- 形象比喻:它就像书籍前面的目录或图书馆的索引卡片。
- 本质:它是“空间换时间”的权衡。通过占用一部分磁盘空间来存储字段值与物理行号的映射关系,从而极大地提高查询速度。
2. 开发者最关心的:索引是如何生效的?
关键点:索引是自动且透明的
你不需要在代码中显式“调用”索引。当你为某个字段创建索引后,数据库的查询优化器(Query Optimizer)会自动判断当前查询是否适合使用该索引。
你的业务代码完全不需要修改:
# 无论有没有索引,你的查询代码都长这样:
result = db.execute("SELECT * FROM documents WHERE status = 'processing'")区别仅在于: 数据库内部执行这条 SQL 的路径从“逐行扫描”变成了“目录跳转”。
3. 性能对比:有无索引的区别
假设
documents 表有 10 万条 数据,我们要查找 status = 'processing' 的记录。特性 | 无索引 (Full Table Scan) | 有索引 (Index Seek) |
工作原理 | 从第 1 行查到第 10 万行,逐一比对 | 直接根据“目录”找到对应行号,只读目标行 |
检查行数 | 100,000 行 | 2 行 (假设只有2条匹配) |
执行耗时 | ~ 500ms (随数据量线性增长) | ~ 2ms (几乎不随数据量增长) |
算法复杂度 | $O(N)$ | $O(\log N)$ 或 $O(1)$ |
4. 索引的生命周期
索引并不是静止的,它伴随数据的产生而产生,随数据的变化而更新。
阶段一:创建阶段(一次性成本)
CREATE INDEX idx_documents_status ON documents(status);此时数据库会扫描全表一次,将所有
status 的值进行排序并记录物理地址,生成如下映射表:status 值 | 对应的行号 (Pointer) |
'completed' | [1, 2, 4, 5, 6, ...] |
'failed' | [88, 555, 1234] |
'processing' | [3, 100000] |
阶段二:维护阶段(持续成本)
每当对数据进行 写操作 时,数据库会自动更新索引:
- INSERT:插入新行后,在索引目录中添加该行的行号。
- UPDATE:如果修改了被索引的字段,需要把行号从旧分类移到新分类。
- DELETE:从索引目录中删除该行号。
5. 总结:索引的利与弊
核心原则: 索引不是越多越好,要给“经常出现在 WHERE 条件中”的字段建索引。
优点
- 极速查询:大幅提升
SELECT性能。
- 减少 IO:不需要读取无关的磁盘数据块。
代价(The Cost)
由于索引需要自动维护,它会带来以下开销:
操作 | 影响 | 原因 |
SELECT | 显著变快 | 直接定位,无需全表扫描 |
INSERT | 稍变慢 | 除了存数据,还要更新索引结构 |
UPDATE | 稍变慢 | 涉及索引字段修改时,需要重排索引 |
DELETE | 稍变慢 | 需要同步清理索引条目 |
存储空间 | 增加 | 索引本身也是文件,需要占用物理磁盘空间 |
6. 快速问答 (Q&A)
- Q:索引在哪里创建?
- A:建表时或之后,通过 SQL 语句
CREATE INDEX创建。
- Q:代码要改吗?
- A:完全不用,SQL 语句和逻辑保持原样。
- Q:所有字段都该加索引吗?
- A:不。高频更新且很少被查询的字段不建议加,这会白白拖慢写入速度。
- Author:盛溪
- URL:https://tangly1024.com/article/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0%EF%BC%9A%E6%B7%B1%E5%85%A5%E6%B5%85%E5%87%BA%E6%95%B0%E6%8D%AE%E5%BA%93%E7%B4%A2%E5%BC%95%20(Database%20Indexing)
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts

.jpg?table=block&id=26f7c1d5-a1e9-80d7-a52b-e71bb7079501&t=26f7c1d5-a1e9-80d7-a52b-e71bb7079501)

