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入门命令之函数-单行函数-流程控制函数
Apr 05 MySQL
MySQL触发器的使用
May 24 MySQL
详细谈谈MYSQL中的COLLATE是什么
Jun 11 MySQL
MySQL系列之十一 日志记录
Jul 02 MySQL
SQL实现LeetCode(176.第二高薪水)
Aug 04 MySQL
面试提问mysql一张表到底能存多少数据
Mar 13 MySQL
Innodb存储引擎中的后台线程详解
Apr 03 MySQL
Mysql排查分析慢sql之explain实战案例
Apr 19 MySQL
MySQL数据库事务的四大特性
Apr 20 MySQL
详解Mysql数据库平滑扩容解决高并发和大数据量问题
May 25 MySQL
MySql按时,天,周,月进行数据统计
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
MySQL数据源表结构图示
2008/06/05 PHP
php实现将Session写入数据库
2015/07/26 PHP
PHP迭代器和生成器用法实例分析
2019/09/28 PHP
PHP8.0新功能之Match表达式的使用
2020/07/19 PHP
PHP读取文件或采集时解决中文乱码
2021/03/09 PHP
用JS实现一个页面多个css样式实现
2008/05/29 Javascript
jQuery实现自定义下拉列表
2015/01/05 Javascript
浅谈Jquery核心函数
2015/06/18 Javascript
JavaScript生成SQL查询表单的方法
2015/08/13 Javascript
jQuery验证插件validate使用方法详解
2020/09/13 Javascript
jQuery Mobile和HTML5开发App推广注册页
2016/11/07 Javascript
vuex操作state对象的实例代码
2018/04/25 Javascript
Chart.js 轻量级HTML5图表绘制工具库(知识整理)
2018/05/22 Javascript
微信小程序实现省市区三级地址选择
2020/06/21 Javascript
vue+iview使用树形控件的具体使用
2020/11/02 Javascript
python获取一组汉字拼音首字母的方法
2015/07/01 Python
python爬虫实现教程转换成 PDF 电子书
2017/02/19 Python
python 实现数组list 添加、修改、删除的方法
2018/04/04 Python
python 剪切移动文件的实现代码
2018/08/02 Python
对Python中Iterator和Iterable的区别详解
2018/10/18 Python
python使用phoenixdb操作hbase的方法示例
2019/02/28 Python
详解爬虫被封的问题
2019/04/23 Python
django admin 根据choice字段选择的不同来显示不同的页面方式
2020/05/13 Python
Python 合并拼接字符串的方法
2020/07/28 Python
销售所有的狗狗产品:Dog.com
2016/10/13 全球购物
意大利香水和彩妆护肤品购物网站:Ditano
2017/08/13 全球购物
美体小铺印度官网:The Body Shop印度
2019/10/17 全球购物
随机分配座位,共50个学生,使学号相邻的同学座位不能相邻
2014/01/18 面试题
UDP协议功能
2013/01/06 面试题
JS原生实现轮播图的几种方法
2021/03/23 Javascript
市场营销专业毕业生自荐信
2013/11/02 职场文书
上课睡觉检讨书
2014/01/28 职场文书
建筑院校毕业生求职信
2014/06/13 职场文书
园林系毕业生求职信
2014/06/23 职场文书
会议承办单位欢迎词
2015/09/30 职场文书
Python中re模块的元字符使用小结
2022/04/07 Python