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

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

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

今天一次说清楚。


先搞懂一个前提

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

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


最后一句话总结

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

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

相关推荐
花青泽34 分钟前
5-数据库-SQL注入-联合查询-关键字绕过-day13
数据库·sql
圆山猫6 小时前
[Virtualization](四):Linux KVM/RISC-V 的 vCPU 运行路径
java·linux·risc-v
天桥下的卖艺者7 小时前
使用scitable包,两步生成逆概率删失权重(IPCW)
数据库·r语言
城管不管7 小时前
ReAct、Plan-and-Execute、Reflection 三大智能 Agent 范式核心区别
java·人工智能·算法·spring·ai·动态规划
隔窗听雨眠7 小时前
AI原生数据库浪潮:国产数据库的架构重构与路径之争
数据库
IT小白杨7 小时前
从环境制备到自动化工作流:多账号运营的工程化架构拆解
java·经验分享·自动化·安全架构·指纹浏览器
数据库小学妹7 小时前
数据库选型实战:从数据类型到TCO成本,五维决策框架+九款产品横评
数据库·信创·国产数据库·数据库选型·oracle迁移
豆瓣鸡8 小时前
算法日记 - Day3
java·开发语言·算法
萧瑟余晖8 小时前
Java深入解析篇九之NIO详解
java·网络·nio
The Chosen One9858 小时前
高进度算法模板速记(待完善)
java·前端·算法