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

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

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

今天一次说清楚。


先搞懂一个前提

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

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


最后一句话总结

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

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

相关推荐
风哥2号1 分钟前
华为高斯数据库恢复工具FGOGDU(FGEDU openGauss DUL)
数据库·opengauss·华为高斯
2601_962128643 分钟前
【JavaWeb06】Tomcat基础入门:架构理解与基本配置指南
java·架构·tomcat
要开心吖ZSH4 分钟前
腾讯 IM × TRTC 联动实战:后端如何撑起一次视频问诊(混流录制篇)
java·音视频·腾讯云·健康医疗·即时通讯·im
吴声子夜歌6 分钟前
Java——类、对象及方法(二)
java·开发语言
2401_890603409 分钟前
Python入门语法(一)
java·开发语言·python
小蒜学长9 分钟前
springboot党建云课堂学习与管理系统(代码+数据库+LW)
java·数据库·spring boot·后端·学习
2601_9621803310 分钟前
FlinkCDC 实现 MySQL 数据变更实时同步
数据库·mysql
2601_9621896013 分钟前
深入浅出MySQL:概述与体系结构解析
数据库·mysql
Gain_chance19 分钟前
大数据毕业设计实战|Data Insight Platform:用 FastAPI + ClickHouse 打造低门槛全链路数据洞察平台
大数据·数据库·clickhouse·毕业设计·fastapi
mldong21 分钟前
六语言引擎实现对比:同构背后的妥协与差异
java·架构