首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【面试系列】主键索引和唯一索引谁更快?

【面试系列】主键索引和唯一索引谁更快?

作者头像
码农编程进阶笔记
发布2022-09-27 08:42:05
发布2022-09-27 08:42:05
1.9K0
举报

1、主键和唯一索引的区别

  • 主键一定时唯一性索引,唯一性索引并不一定是主键
  • 一个表中可以有多个唯一性索引,但只能有一个主键
  • 主键不允许有空值,而唯一索引允许有空值
  • 主键可以被其他字段作外键引用,而唯一性索引不能

2、主键 和 唯一索引 谁更快

InnoDB使用B+树作为索引结构。在B+树中,将节点分为叶子结点和非叶子节点非叶子节点上保存的是索引,而且一个节点可以保存多个索引,数据全部存于叶子节点上,根据叶子节点的内容不同,InnoDB索引分为主键索引非主键索引

例如对于下面这个表,且ID是主键

主键索引和非主键索引的示意图如下:

其中 R 代表一整行的值

  非主键索引的叶子节点存放的是主键的值,而主键索引的叶子节点存放的是整行数据,其中非主键索引也被称为二级索引,而主键索引也成为聚簇索引

根据这两种结构我们来进行下查询,看看他们在查询上有什么区别。

1、如果查询语句是 select * from table where ID = 100,即主键查询的方式,则只需要搜索 ID 这棵 B+树。

2、如果查询语句是 select * from table where k = 1,即非主键的查询方式,则先搜索k索引树,得到ID=100,再到ID索引树搜索一次,这个过程也被称为回表

也就是说,非主键索引查询会比主键查询多搜索一棵树。

面试又给我问到MySQL索引【索引的实现原理】

你知道数据库索引的工作原理吗?

MySQL为什么选择B+树存储索引

3、为什么建议使用主键自增的索引?

这是一颗主键索引的树

如果我们插入 ID = 650 的一行数据,那么直接在最右边插入就可以了

但是如果插入的是 ID = 350 的一行数据,由于 B+ 树是有序的,为了维持树的有序性,叶子节点将会进行挪动,此时,如果在已经存储满状态的数据页中插入节点,将会申请新的数据页,将部分数据挪动到新的数据页,这个过程称为页分裂

  页分裂除了会影响性能,还会降低磁盘空间的利用率。不规则数据插入时,会造成频繁的页分裂。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-08-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农编程进阶笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档