主键、外键、索引,一篇讲透

主键、外键、索引,一篇讲透

很多人学数据库,卡在这三个概念上。不是因为难,是因为没人把它们放在一起对比过。

今天一次说清楚。


先搞懂一个前提

数据库里的表,本质上就是一张 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:外键必须加

不是。外键是一种约束,很多互联网公司为了性能会去掉外键,靠代码层保证一致性。但初学者建议先用上。


最后一句话总结

  • 主键 → 这行数据是谁
  • 外键 → 这行数据属于谁
  • 索引 → 这行数据在哪

三个东西,三个问题,各管各的。

相关推荐
景熙552341 分钟前
15.Java 8 Stream 流入门到实战
java·开发语言·数据结构
哈__44 分钟前
KES-Operator重塑Kubernetes环境下的KES数据库集群管理
数据库·kubernetes·operator·kes
wno7041 小时前
Spring Security权限控制
java·python·spring
杨运交2 小时前
[071][验证码模块]基于Spring拦截器的验证码认证设计思想
java·后端·spring
Geek-Chow2 小时前
CountDownLatch in Java
java
IvorySQL2 小时前
IvorySQL 5.6 发布:PG 18.6 内核升级,沙盒即开即用
数据库·人工智能·postgresql
SL_staff3 小时前
从RBAC到场景化授权:《无忧·企业文档》三级权限模型的技术实践解析
java·开源·产品
CNSSIRD数据库3 小时前
中国企业环境信用数据库2003-2026
大数据·数据库·数据分析·论文笔记
传奇开心果编程3 小时前
【springboot基础语法学与练】第 1 课:从零开始
java·spring boot·后端·学习
SL_staff3 小时前
财务系统慎用低代码?从数据模型闭环看合规落地的技术实践
java·低代码·全栈