面试官:MySQL 唯一索引和主键索引的区别?

面试官:MySQL 唯一索引和主键索引的区别?

mysql fetch into

面试考察点索引类型理解:面试官不仅仅是想知道 “有什么区别”,更是想考察你是否理解主键索引(聚簇索引)和唯一索引(二级索引)在存储结构上的根本差异。NULL 值处理:考察你是否清楚主键不允许 NULL,而唯一索引可以(但只能有一个),这是很多面试者容易忽略的细节。性能优化意识:理解聚簇索引和非聚簇索引的查询效率差异,能否在设计表结构时做出正确选择。核心答案

主键索引:一种特殊的唯一索引,每张表只能有一个,用于唯一标识每一行记录, 中主键是 聚簇索引。

唯一索引:保证索引列的值唯一,一张表可以有多个唯一索引, 中唯一索引是 二级索引(非聚簇索引)。

核心区别对比:

对比维度

主键索引()

唯一索引()

数量限制

每表 只能有 1 个

每表 可以有多个

NULL 值

不允许

NULL

允许

NULL(但最多 1 个)

存储结构

聚簇索引,叶子节点存完整数据

二级索引,叶子节点存主键值

索引回表

不需要回表

需要回表(查询非索引列时)

创建语法

KEY (col)

KEY (col)

是否必须

建议有,但不强制

按需创建

mysql fetch into

一句话总结:主键是 唯一的聚簇索引,不允许 NULL;唯一索引是 可以有多个的非聚簇索引mysql fetch into,允许 NULL。

深度解析

一、存储结构差异:聚簇索引 vs 二级索引

主键索引和唯一索引在 中的存储结构完全不同:

mysql fetch into

上图对比了主键索引和唯一索引的存储结构。关键区别在于:

二、NULL 值处理差异

这是面试中的高频考点:

-- 创建测试表
CREATE TABLE user (
    id BIGINT PRIMARY KEY,           -- 主键,不允许 NULL
    email VARCHAR(50) UNIQUE,        -- 唯一索引,允许 NULL
    phone VARCHAR(20) UNIQUE         -- 唯一索引,允许 NULL
);
-- 主键测试:插入 NULL 会报错
INSERT INTO user (id, email) VALUES (NULL, 'test@qq.com');
--  ERROR 1048: Column 'id' cannot be null
-- 唯一索引测试:允许 NULL,且 MySQL 中可以插入多个 NULL
INSERT INTO user (id, email) VALUES (1, NULL);      --  成功
INSERT INTO user (id, email) VALUES (2, NULL);      --  成功(MySQL 认为多个 NULL 不重复)
INSERT INTO user (id, email) VALUES (3, 'a@qq.com'); --  成功
INSERT INTO user (id, email) VALUES (4, 'a@qq.com'); --  Duplicate entry

mysql fetch into

关键结论:

三、查询性能差异:回表问题

通过主键查询 vs 通过唯一索引查询的性能差异:

-- 表结构
CREATE TABLE user (
    id BIGINT PRIMARY KEY,
    email VARCHAR(50) UNIQUE,
    name VARCHAR(50),
    age INT
);
-- 场景 1:通过主键查询
SELECT * FROM user WHERE id = 1;
--  直接走聚簇索引,一次查询即可获取完整数据
-- 场景 2:通过唯一索引查询所有字段
SELECT * FROM user WHERE email = 'test@qq.com';
-- ️ 需要回表:先查唯一索引得到 id,再回表查聚簇索引
-- 场景 3:通过唯一索引查询索引列(覆盖索引)
SELECT email FROM user WHERE email = 'test@qq.com';
--  覆盖索引,不需要回表

mysql fetch into

四、使用场景建议

场景

推荐索引类型

原因

标识每一行记录

主键索引

每表必须有唯一标识面试官:MySQL 唯一索引和主键索引的区别?,推荐自增

用户邮箱不能重复

唯一索引

mysql fetch into

业务唯一性约束,允许未设置邮箱(NULL)

手机号唯一

唯一索引

允许用户暂未绑定手机号

身份证号唯一

唯一索引

允许 NULL(可能未录入)

联合唯一(用户 + 日期)

联合唯一索引

KEY (, date)

最佳实践:

-- 推荐:使用 BIGINT 自增主键
CREATE TABLE orders (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    order_no VARCHAR(32) UNIQUE NOT NULL,  -- 业务订单号,不允许 NULL
    user_id BIGINT NOT NULL,
    INDEX idx_user (user_id)
);
-- 不推荐:没有主键的表
-- MySQL 会自动选择一个非空唯一索引作为聚簇索引
-- 如果没有合适的,会生成一个隐藏的 6 字节主键

五、如果没有主键会怎样?

要求每张表必须有聚簇索引:

mysql fetch into

面试高频追问

答:自增主键是顺序插入的,B+ 树叶子节点顺序追加,不会产生页分裂;UUID 是无序的,插入会导致频繁页分裂,影响性能。此外,UUID 占用空间大(36 字符 vs 8 字节),降低索引效率。

答:可以,但 会自动选择一个非空唯一索引作为聚簇索引;如果没有合适的,会生成隐藏的 6 字节 。但强烈不建议这样做,应该显式定义主键。

答:本质区别和单列一样——联合主键是聚簇索引,不允许任何列为 NULL;联合唯一索引是二级索引,允许列为 NULL。

常见面试变体记忆口诀

主键 vs 唯一索引:

主键聚簇:叶子存完整数据,查询不回表唯一二级:叶子存主键值,查询需回表NULL 有别:主键不允许,唯一索引可以数量不同:主键唯一一个mysql fetch into,唯一索引多个总结

主键索引是 聚簇索引,每表只能有一个,不允许 NULL面试官:MySQL 唯一索引和主键索引的区别?,叶子节点存储完整行数据;唯一索引是 二级索引,可以有多个,允许 NULL(可多个)mysql fetch into,叶子节点存储主键值。查询时主键直接获取数据,唯一索引需要回表。推荐使用 自增主键,业务唯一约束用唯一索引。

公告:
1. 本站所有资源来源于用户上传和网络,如有侵权请联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长处理!
6. 本站不售卖代码,资源标价只是站长收集整理的辛苦费!如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
7. 站长QQ号码 2205675299

资源库 - 资源分享下载网 » 面试官:MySQL 唯一索引和主键索引的区别?

常见问题FAQ

关于资源售价和售后服务的说明?
本站所有资源的标价均为本站收集资源的辛苦费,不代表资源本身的价值。软件是高智慧高价值的商品,不可能是白菜价。本站资源标价只是赞助费用,收取的赞助费仅用来维持本站的日常运营!毕竟收集整理资料需要投入云计算资源和站长大量的精力。
代码有没有售后服务和技术支持?
由于代码的运行具有不可预见性,本站不保证代码完整可运行,不提供技术支持和售后服务。 本站原创代码都是站长自己开发的,可以有偿提供技术支持服务。 网站里标明【亲测】的代码都是站长亲测过的,其他的代码由于精力有限,没有一一测试,不能保证代码就一定能够使用,更没有技术支持服务,下载前请自行斟酌。
有没有搭建服务?
由于搭建服务比较费时费力,所以本站除了原创代码外均不提供搭建服务。本站分享代码纯属兴趣爱好,不以盈利为目的,请勿咨询有没有搭建服务,谢谢理解。
链接地址失效了怎么办?
请带上资源链接地址联系客服,工作时间内我们看到后将第一时间回复。
关于解压密码
本站资源一般都没有加密,如果发现需要解压密码的,那么就输入 hao.35dc.com 试试。

发表评论

资源库,由老程序员细心甄别、精心筛选,只为提供优质的源码资源

关于我们 联系我们