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 条件中”的字段建索引。

优点

  1. 极速查询:大幅提升 SELECT 性能。
  1. 减少 IO:不需要读取无关的磁盘数据块。

代价(The Cost)

由于索引需要自动维护,它会带来以下开销:
操作
影响
原因
SELECT
显著变快
直接定位,无需全表扫描
INSERT
稍变慢
除了存数据,还要更新索引结构
UPDATE
稍变慢
涉及索引字段修改时,需要重排索引
DELETE
稍变慢
需要同步清理索引条目
存储空间
增加
索引本身也是文件,需要占用物理磁盘空间

6. 快速问答 (Q&A)

  • Q:索引在哪里创建?
    • A:建表时或之后,通过 SQL 语句 CREATE INDEX 创建。
  • Q:代码要改吗?
    • A:完全不用,SQL 语句和逻辑保持原样。
  • Q:所有字段都该加索引吗?
    • A:不。高频更新且很少被查询的字段不建议加,这会白白拖慢写入速度。
 
 
 
 
 
 
 
 
 
 
 
 
疯狂Jāva讲义(第5版)(李刚)笔误Data Engineering Introduction to Data Engineering
Loading...
盛溪
盛溪
盛溪的学习&生活博客
Announcement
🌟 欢迎来到盛溪的博客!🌟
大家好,我是盛溪。在这里,我将分享我的生活感悟、学习心得以及其他一些有趣的发现。希望我的文章能为你的生活带来一点启发和乐趣。
微信号: felix_windsor
📅 更新通知:
  • 我会定期更新博客,分享新的内容。
💬 互动环节:
  • 如果你有任何问题或想法,欢迎在评论区留言。我非常期待与你的互动!
📚 推荐阅读:
  • 不定期推荐一些我觉得有价值的书籍或资源,希望能对你有所帮助。
感谢你的访问和支持,希望你能常来逛逛!
盛溪敬上