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 相关文章推荐
mysql对于模糊查询like的一些汇总
May 09 MySQL
Mysql Online DDL的使用详解
May 20 MySQL
MySQL 时间类型的选择
Jun 05 MySQL
MySQL为id选择合适的数据类型
Jun 07 MySQL
mysql配置SSL证书登录的实现
Sep 04 MySQL
mysql函数全面总结
Nov 11 MySQL
mysql的单列多值存储实例详解
Apr 05 MySQL
MySQL视图概念以及相关应用
Apr 19 MySQL
MySQL实现字段分割一行转多行的示例代码
Jul 07 MySQL
MySQL中正则表达式(REGEXP)使用详解
Jul 07 MySQL
MySQL的意向共享锁、意向排它锁和死锁
Jul 15 MySQL
MySQL一劳永逸永久支持输入中文的方法实例
Aug 05 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中计算时间差的几种方法
2009/12/31 PHP
PHP 二维数组根据某个字段排序的具体实现
2014/06/03 PHP
PHP中使用localhost连接Mysql不成功的解决方法
2014/08/20 PHP
php验证session无效的解决方法
2014/11/04 PHP
phpstorm配置Xdebug进行调试PHP教程
2014/12/01 PHP
PHP保存带BOM文件的方法
2015/02/12 PHP
php限制上传文件类型并保存上传文件的方法
2015/03/13 PHP
php常用字符函数实例小结
2016/12/29 PHP
基于jQuery的获得各种控件Value的方法
2010/11/19 Javascript
javascript 事件处理程序介绍
2012/06/27 Javascript
jquery实现盒子下拉效果示例代码
2013/09/12 Javascript
jQuery统计上传文件大小的方法
2015/01/24 Javascript
JavaScript实现向OL列表内动态添加LI元素的方法
2015/03/21 Javascript
总结javascript中的六种迭代器
2016/08/16 Javascript
JS解析url查询参数的简单代码
2017/08/06 Javascript
vue+springboot前后端分离实现单点登录跨域问题解决方法
2018/01/30 Javascript
JavaScript内置对象之Array的使用小结
2020/05/12 Javascript
PHP读取远程txt文档到数组并实现遍历
2020/08/25 Javascript
[01:15:18]2014 DOTA2国际邀请赛中国区预选赛 LGD VS Speed Gaming.cn
2014/05/22 DOTA
[03:00]DOTA2-DPC中国联赛1月18日Recap集锦
2021/03/11 DOTA
python绘图方法实例入门
2015/05/19 Python
python简单判断序列是否为空的方法
2015/06/30 Python
关于Python中Inf与Nan的判断问题详解
2017/02/08 Python
pyspark操作MongoDB的方法步骤
2019/01/04 Python
django认证系统实现自定义权限管理的方法
2019/08/28 Python
pytorch 计算ConvTranspose1d输出特征大小方式
2020/06/23 Python
HTML5 Canvas绘制文本及图片的基础教程
2016/03/14 HTML / CSS
canvas 橡皮筋式线条绘图应用方法
2019/02/13 HTML / CSS
xml有哪些解析技术?区别是什么
2016/04/26 面试题
安全负责人任命书
2014/06/06 职场文书
乡镇党委书记个人整改措施
2014/09/15 职场文书
二手车交易协议书标准版
2014/11/16 职场文书
综合办公室岗位职责
2015/04/11 职场文书
如何使用PyCharm及常用配置详解
2021/06/03 Python
为了顺利买到演唱会的票用Python制作了自动抢票的脚本
2021/10/16 Python
详解Flutter网络请求Dio库的使用及封装
2022/04/14 Java/Android