MySQL聚簇索引和非聚簇索引的区别详情


Posted in MySQL onJune 14, 2022

前言:

在 MySQL 默认引擎 InnoDB 中,索引大致可分为两类:聚簇索引和非聚簇索引,它们的区别也是常见的面试题,所以我们今天就来盘它们。

聚簇索引

聚簇索引(Clustered Index)一般指的是主键索引(如果存在主键索引的话),聚簇索引也被称之为聚集索引。

聚簇索引在 InnoDB 中是使用 B+ 树实现的,比如我们创建一张 student 表,它的构建 SQL 如下:

drop table if exists student;
create table student(
    id int primary key,
    name varchar(16),
    class_id int not null,
    index (class_id)
)engine=InnoDB;
-- 添加测试数据
insert into student(id,name,class_id) values(1,'张三',100),
    (2,'李四',200),(3,'王五',300);

以上 student 表中有一个聚簇索引(也就是主键索引)id,和一个非聚簇索引 class_id。

聚簇索引 id 对应的 B+ 树如下图所示: 

MySQL聚簇索引和非聚簇索引的区别详情

 在聚簇索引的叶子节点直接存储用户信息的内存地址,我们使用内存地址可以直接找到相应的行数据。

非聚簇索引

非聚簇索引在 InnoDB 引擎中,也叫二级索引,以上面 student 表为例,

在 student 中非聚簇索引 class_id 对应 B+ 树如下图所示: 

MySQL聚簇索引和非聚簇索引的区别详情

从上图我们可以看出,在非聚簇索引的叶子节点上存储的并不是真正的行数据,而是主键 ID,所以当我们使用非聚簇索引进行查询时,首先会得到一个主键 ID,然后再使用主键 ID 去聚簇索引上找到真正的行数据,我们把这个过程称之为回表查询

总结

在 MySQL 的 InnoDB 引擎中,每个索引都会对应一颗 B+ 树,而聚簇索引和非聚簇索引最大的区别在于叶子节点存储的数据不同,聚簇索引叶子节点存储的是行数据,因此通过聚簇索引可以直接找到真正的行数据;而非聚簇索引叶子节点存储的是主键信息,所以使用非聚簇索引还需要回表查询,因此我们可以得出聚簇索引和非聚簇索引的区别主要有以下几个:

  • 聚簇索引叶子节点存储的是行数据;而非聚簇索引叶子节点存储的是聚簇索引(通常是主键 ID)。
  • 聚簇索引查询效率更高,而非聚簇索引需要进行回表查询,因此性能不如聚簇索引。
  • 聚簇索引一般为主键索引,而主键一个表中只能有一个,因此聚簇索引一个表中也只能有一个,而非聚簇索引则没有数量上的限制。

到此这篇关于MySQL聚簇索引和非聚簇索引的区别详情的文章就介绍到这了,更多相关MySQL聚簇索引和非聚簇索引内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!


Tags in this post...

MySQL 相关文章推荐
Windows10下安装MySQL8
Apr 06 MySQL
mysql查询的控制语句图文详解
Apr 11 MySQL
MySQL数字类型自增的坑
May 07 MySQL
详解MySQL中的pid与socket
Jun 15 MySQL
MySQL系列之十四 MySQL的高可用实现
Jul 02 MySQL
mysql如何能有效防止删库跑路
Oct 05 MySQL
MyBatis 动态SQL全面详解
Oct 05 MySQL
分享MySQL常用 内核 Debug 几种常见方法
Mar 17 MySQL
简单聊一聊SQL注入及防止SQL注入
Mar 23 MySQL
mysql使用instr达到in(字符串)的效果
Apr 03 MySQL
MySQL自定义函数及触发器
Aug 05 MySQL
MySQL 原理与优化之Limit 查询优化
Aug 14 MySQL
关于mysql中string和number的转换问题
Jun 14 #MySQL
mysql实现将字符串字段转为数字排序或比大小
Jun 14 #MySQL
手把手带你彻底卸载MySQL数据库
MYSQL中文乱码问题的解决方案
Jun 14 #MySQL
MySQL运行报错:“Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre”解决方法
Jun 14 #MySQL
MySql如何将查询的出来的字段进行转换
Jun 14 #MySQL
MySQL安装失败的原因及解决步骤
You might like
php实现的错误处理封装类实例
2017/06/20 PHP
PHP实现基于3DES算法加密解密字符串示例
2018/08/24 PHP
可选择和输入的下拉列表框示例
2013/11/05 Javascript
JavaScript加入收藏夹功能(兼容IE、firefox、chrome)
2014/05/05 Javascript
Javascript动态创建div的方法
2015/02/09 Javascript
在for循环中length值是否需要缓存
2015/07/27 Javascript
JS+CSS实现自适应选项卡宽度的圆角滑动门效果
2015/09/15 Javascript
详解微信小程序开发之——wx.showToast(OBJECT)的使用
2017/01/18 Javascript
vue中各组件之间传递数据的方法示例
2017/07/27 Javascript
基于 Immutable.js 实现撤销重做功能的实例代码
2018/03/01 Javascript
layer.open回调获取弹出层参数的实现方法
2019/09/10 Javascript
Vue 中如何将函数作为 props 传递给组件的实现代码
2020/05/12 Javascript
使用React代码动态生成栅格布局的方法
2020/05/24 Javascript
vue实现井字棋游戏
2020/09/29 Javascript
[56:21]LGD vs IG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
使用Python中的greenlet包实现并发编程的入门教程
2015/04/16 Python
Django与遗留的数据库整合的方法指南
2015/07/24 Python
Python实现网络端口转发和重定向的方法
2016/09/19 Python
Django接受前端数据的几种方法总结
2016/11/04 Python
Python3实现转换Image图片格式
2018/06/21 Python
python实现字符串中字符分类及个数统计
2018/09/28 Python
Python高级编程之继承问题详解(super与mro)
2019/11/19 Python
Python爬虫实现vip电影下载的示例代码
2020/04/20 Python
python实现xlwt xlrd 指定条件给excel行添加颜色
2020/07/14 Python
使用gunicorn部署django项目的问题
2020/12/30 Python
国际领先的在线时尚服装和配饰店:DressLily
2019/03/03 全球购物
美国相机和电子产品零售商:Beach Camera
2020/11/26 全球购物
JVM是一个编译程序还是解释程序
2012/09/11 面试题
迟到检讨书大全
2014/01/25 职场文书
库房保管员岗位职责
2014/04/07 职场文书
领导班子专题民主生活会情况想汇报
2014/09/30 职场文书
硕士毕业论文导师评语
2014/12/31 职场文书
班主任工作总结范文
2015/08/13 职场文书
用Python远程登陆服务器的步骤
2021/04/16 Python
详解Laravel服务容器的优势
2021/05/29 PHP
JVM钩子函数的使用场景详解
2021/08/23 Java/Android