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 MVCC机制原理详解
Apr 20 MySQL
MySQL 重命名表的操作方法及注意事项
May 21 MySQL
Mysql 如何实现多张无关联表查询数据并分页
Jun 05 MySQL
MySQL一些常用高级SQL语句
Jul 03 MySQL
mysql定时自动备份数据库的方法步骤
Jul 07 MySQL
面试被问select......for update会锁表还是锁行
Nov 11 MySQL
SQL 聚合、分组和排序
Nov 11 MySQL
Mysql InnoDB 的内存逻辑架构
May 06 MySQL
mysql如何查询连续记录
May 11 MySQL
MySQL外键约束(Foreign Key)案例详解
Jun 28 MySQL
MySQL存储过程及语法详解
Aug 05 MySQL
MySQL中的 inner join 和 left join的区别解析(小结果集驱动大结果集)
May 08 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中文分词的简单实现代码分享
2011/07/17 PHP
PHP 伪静态技术原理以及突破原理实现介绍
2013/07/12 PHP
PHP实现简单汉字验证码
2015/07/28 PHP
用JavaScript脚本实现Web页面信息交互
2006/10/11 Javascript
Jquery遍历Json数据的方法
2015/04/20 Javascript
浅析AngularJS中的指令
2016/03/20 Javascript
React实现点击删除列表中对应项
2017/01/10 Javascript
jquery——九宫格大转盘抽奖实例
2017/01/16 Javascript
js实现京东轮播图效果
2017/06/30 Javascript
JS 中LocalStorage和SessionStorage的使用
2017/08/17 Javascript
Promise.all中对于reject的处理方法
2018/08/01 Javascript
vue element 中的table动态渲染实现(动态表头)
2019/11/21 Javascript
python基础教程之获取本机ip数据包示例
2014/02/10 Python
python学习数据结构实例代码
2015/05/11 Python
使用Python写一个贪吃蛇游戏实例代码
2017/08/21 Python
vue.js实现输入框输入值内容实时响应变化示例
2018/07/07 Python
详解Pandas之容易让人混淆的行选择和列选择
2019/07/10 Python
高考考python编程是真的吗
2020/07/20 Python
使用python实现学生信息管理系统
2021/02/25 Python
HTML5+CSS3实例 :canvas 模拟实现电子彩票刮刮乐代码
2016/12/30 HTML / CSS
HTML5 Canvas实现烟花绽放特效
2016/03/02 HTML / CSS
英国打印机墨水和碳粉商店:Printerinks
2017/06/30 全球购物
Marmot土拨鼠官网:美国专业户外运动品牌
2018/01/11 全球购物
PHP中如何创建和修改数组
2012/05/02 面试题
"序列点" 是什么
2016/07/29 面试题
Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
2015/01/27 面试题
留学推荐信写作指南
2014/01/25 职场文书
清华大学自主招生自荐信
2014/01/29 职场文书
2014年乡镇植树节活动方案
2014/02/28 职场文书
走群众路线学习笔记
2014/11/06 职场文书
2014年度考核工作总结
2014/12/24 职场文书
人事主管岗位职责
2015/02/04 职场文书
结婚仪式主持词
2015/06/29 职场文书
2016年企业安全生产月活动总结
2016/04/06 职场文书
go select编译期的优化处理逻辑使用场景分析
2021/06/28 Golang
详解MindSpore自定义模型损失函数
2021/06/30 Python