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

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

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

今天一次说清楚。


先搞懂一个前提

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

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


最后一句话总结

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

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

相关推荐
哥是强混3 分钟前
Means:基于 .NET 10 打造的开源自部署 S3 兼容对象存储服务
网络·数据库·.net
ffqws_8 分钟前
redis面试:如何保证双写一致
数据库·redis·缓存
我才是银古12 分钟前
构建 Java GIS 工具库:从碎片化 API 到统一抽象的设计实践
java·gis·geotools·gdal·esri
水无痕simon23 分钟前
6 数据库同义词
数据库
敲代码的嘎仔1 小时前
实习日志day6--实习日志day6--title命名规范化&businessType纠正&补充缺失的@Log注解&报警与通信模块补充&产出阶段总结文档
java·开发语言·人工智能·git·python·实习·大二
杜子不疼.1 小时前
【Qt初识】信号槽(三):机制意义、断开连接与 Lambda 表达式
开发语言·数据库·qt
编程(变成)小辣鸡1 小时前
Spring事务失效场景
java·后端·spring
极客先躯2 小时前
高级java每日一道面试题-2026年03月30日-实战篇[Docker]-如何监控容器的网络流量?
java·运维·docker·容器·prometheus·高级面试
BomanGe12 小时前
NSK W1501FA高速精密滚珠丝杠技术手册
数据库·经验分享·规格说明书
tachibana22 小时前
hot100 翻转二叉树(226)
java·数据结构·算法·leetcode