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

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

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

今天一次说清楚。


先搞懂一个前提

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

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


最后一句话总结

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

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

相关推荐
头歌实践平台1 小时前
HBase 完全分布式安装(新)
数据库·分布式·hbase
韶博雅1 小时前
oracle优化用到的sql
sql·oracle·ffmpeg
j7~1 小时前
【MYSQL】表的内外连接--详解(重点)
数据库·mysql·内连接·左外连接·右外连接
段ヤシ.2 小时前
回顾Java知识点,面试题汇总Day17(持续更新)
java·springboot·spring security·shiro·mybatis-plus·jdbctemplate·spring data jpa
jjjava2.02 小时前
Java 多线程核心基础与线程安全
java·开发语言
147API2 小时前
Claude Opus 4.8 接口与工程落地分析:长任务调用链应该怎么设计
java·前端·数据库
lulu12165440782 小时前
Claude钩子系统架构设计:从执行时序到扩展机制
java·人工智能·python·ai编程
绝知此事2 小时前
Redis 从入门到精通:Spring Boot 实战三部曲(一)—— 基础核心与快速上手
数据库·redis·缓存
鸽芷咕2 小时前
金仓数据库标量子查询消除:一条SQL从32秒优化到24毫秒
数据库·sql