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 分组查询的优化方法
May 12 MySQL
详解MySQL数据库千万级数据查询和存储
May 18 MySQL
MySQL不使用order by实现排名的三种思路总结
Jun 02 MySQL
MySQL单表千万级数据处理的思路分享
Jun 05 MySQL
MySQL快速插入一亿测试数据
Jun 23 MySQL
MySQL系列之九 mysql查询缓存及索引
Jul 02 MySQL
mysql脏页是什么
Jul 26 MySQL
MySQL中int (10) 和 int (11) 的区别
Jan 22 MySQL
关于MySQL临时表为什么可以重名的问题
Mar 22 MySQL
CentOS MySql8 远程连接实战
Apr 19 MySQL
mysql查找连续出现n次以上的数字
May 11 MySQL
MySQL中的全表扫描和索引树扫描
May 15 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 在windows下配置虚拟目录的方法介绍
2013/06/26 PHP
PHP7基于curl实现的上传图片功能
2018/05/11 PHP
Prototype 学习 工具函数学习($w,$F方法)
2009/07/12 Javascript
整理一些JavaScript的IE和火狐的兼容性注意事项
2011/03/17 Javascript
20个非常棒的 jQuery 幻灯片插件和教程分享
2011/08/23 Javascript
JS、jquery实现几分钟前、几小时前、几天前等时间差显示效果的代码实例分享
2014/04/11 Javascript
Thinkphp模板没有解析直接原样输出的解决方法
2014/10/31 Javascript
基于js实现微信发送好友如何分享到朋友圈、微博
2015/11/30 Javascript
Node.js刷新session过期时间的实现方法推荐
2016/05/18 Javascript
详解JavaScript节流函数中的Throttle
2016/07/16 Javascript
前端微信支付js代码
2016/07/25 Javascript
Node.js通过身份证号验证年龄、出生日期与性别方法示例
2017/03/09 Javascript
详解vuex结合localstorage动态监听storage的变化
2018/05/03 Javascript
对TypeScript库进行单元测试的方法
2019/07/18 Javascript
解析JS在获取当前月的最后一天遇到的坑
2019/08/30 Javascript
原生Vue 实现右键菜单组件功能
2019/12/16 Javascript
vue中实现回车键登录功能
2020/02/19 Javascript
vue 项目软键盘回车触发搜索事件
2020/09/09 Javascript
JS+CSS实现动态时钟
2021/02/19 Javascript
[50:48]LGD vs CHAOS 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
详解用python实现简单的遗传算法
2018/01/02 Python
Python3多进程 multiprocessing 模块实例详解
2018/06/11 Python
python发送多人邮件没有展示收件人问题的解决方法
2019/06/21 Python
Python数据相关系数矩阵和热力图轻松实现教程
2020/06/16 Python
详解python 支持向量机(SVM)算法
2020/09/18 Python
薇姿法国官网:Vichy法国
2021/01/28 全球购物
求职简历自荐信
2013/10/20 职场文书
电大会计学自我鉴定
2014/02/06 职场文书
学校教研活动总结
2014/07/02 职场文书
文员岗位职责
2015/02/04 职场文书
幼师辞职信范文大全
2015/05/12 职场文书
离婚起诉书怎么写
2015/05/19 职场文书
记者节感言
2015/08/03 职场文书
Redis实现订单自动过期功能的示例代码
2021/05/08 Redis
Node实现搜索框进行模糊查询
2021/06/28 Javascript
MySQL多表查询机制
2022/03/17 MySQL