主键、外键、索引,一篇讲透
很多人学数据库,卡在这三个概念上。不是因为难,是因为没人把它们放在一起对比过。
今天一次说清楚。
先搞懂一个前提
数据库里的表,本质上就是一张 Excel 表格。
但 Excel 查十万行数据会卡死,数据库不会。靠的就是主键、外键、索引这三样东西。
它们解决的是不同的问题。
一、主键(Primary Key)
一句话:给每一行数据一个唯一身份证。
| 特性 | 说明 |
|---|---|
| 作用 | 唯一标识每一行,不能重复,不能为空 |
| 数量 | 一张表只能有 1 个 主键 |
| 常见类型 | 自增ID(1,2,3...)、UUID、业务编号 |
举个例子:
| id(主键) | 姓名 | 年龄 |
|---|---|---|
| 1 | 张三 | 25 |
| 2 | 李四 | 30 |
| 3 | 王五 | 28 |
没有主键,你就没法准确说"我要改张三那条记录"------因为可能有两个张三。
记住:主键是用来找"这一行"的。
二、外键(Foreign Key)
一句话:建立两张表之间的关系。
| 特性 | 说明 |
|---|---|
| 作用 | 让一张表的字段,指向另一张表的主键 |
| 数量 | 一张表可以有 多个 外键 |
| 本质 | 一种约束,保证数据不会"断链" |
举个例子:
用户表:
| id(主键) | 姓名 |
|---|---|
| 1 | 张三 |
| 2 | 李四 |
订单表:
| 订单id | 商品 | user_id(外键) |
|---|---|---|
| 101 | 手机 | 1 |
| 102 | 电脑 | 2 |
user_id = 1 指向用户表的 id = 1,这就是外键的含义。
好处 : 你没法创建一个 user_id = 999 的订单,因为用户表里没有这个人。数据库会直接报错。
记住:外键是用来连"两张表"的。
三、索引(Index)
一句话:给查询加速的"目录"。
| 特性 | 说明 |
|---|---|
| 作用 | 让查询更快,类似书的目录 |
| 数量 | 一张表可以有 多个 索引 |
| 代价 | 占空间,写入变慢(每次增删改都要更新索引) |
为什么需要索引?
没有索引,查 name = '张三',数据库要逐行扫描整张表。十万行就比十万次。
有了索引,数据库直接定位,速度提升几个数量级。
注意:主键自带索引,但索引不一定是主键。
记住:索引是用来让查询"更快"的。
四、一张图对比
| 主键 | 外键 | 索引 | |
|---|---|---|---|
| 解决什么问题 | 唯一标识一行 | 表与表的关联 | 查询速度慢 |
| 能有几个 | 1个 | 多个 | 多个 |
| 能为空吗 | ❌ 不能 | ✅ 可以 | ✅ 可以 |
| 本质是什么 | 约束 | 约束 | 数据结构(类似目录) |
| 必选吗 | ✅ 建议必设 | ❌ 可选 | ❌ 按需添加 |
五、常见误区
❌ 误区1:主键就是索引
不完全对。主键自带唯一索引,但普通索引不是主键。你可以给 name 字段加索引,但 name 不是主键(因为可能重复)。
❌ 误区2:索引越多越好
错。每个索引都会拖慢写入速度。只给经常查的字段加索引。
❌ 误区3:外键必须加
不是。外键是一种约束,很多互联网公司为了性能会去掉外键,靠代码层保证一致性。但初学者建议先用上。
最后一句话总结
- 主键 → 这行数据是谁
- 外键 → 这行数据属于谁
- 索引 → 这行数据在哪
三个东西,三个问题,各管各的。