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 相关文章推荐
多表查询、事务、DCL
Apr 05 MySQL
MySQL中distinct和count(*)的使用方法比较
May 26 MySQL
mysql优化之query_cache_limit参数说明
Jul 01 MySQL
MySQL的Query Cache图文详解
Jul 01 MySQL
QT连接MYSQL数据库的详细步骤
Jul 07 MySQL
MySQL令人大跌眼镜的隐式转换
Aug 23 MySQL
记一次Mysql不走日期字段索引的原因小结
Oct 24 MySQL
mysql事务隔离级别详情
Oct 24 MySQL
MYSQL 表的全面总结
Nov 11 MySQL
利用JuiceFS使MySQL 备份验证性能提升 10 倍
Mar 17 MySQL
MYSQL优化之数据表碎片整理详解
Apr 03 MySQL
MySQL时区造成时差问题
Apr 13 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中的HashTable结构详解
2013/06/13 PHP
php计算整个mysql数据库大小的方法
2015/06/19 PHP
php实现对象克隆的方法
2015/06/20 PHP
php+mysql查询实现无限下级分类树输出示例
2016/10/03 PHP
详解js中构造流程图的核心技术JsPlumb(2)
2015/12/08 Javascript
JavaScript+html5 canvas实现图片破碎重组动画特效
2016/02/22 Javascript
js 上传文件预览的简单实例
2016/08/16 Javascript
JQuery遍历元素的父辈和祖先的方法
2016/09/18 Javascript
原生js实现焦点轮播图效果
2017/01/12 Javascript
微信小程序 实现点击添加移除class
2017/06/12 Javascript
jQuery实现拼图小游戏(实例讲解)
2017/07/24 jQuery
js监听html页面的上下滚动事件方法
2018/09/11 Javascript
vue.js使用v-model实现父子组件间的双向通信示例
2020/02/05 Javascript
微信小程序实现左滑删除效果
2020/11/18 Javascript
Python 错误和异常小结
2013/10/09 Python
初步探究Python程序的执行原理
2015/04/11 Python
python类继承与子类实例初始化用法分析
2015/04/17 Python
django框架自定义用户表操作示例
2018/08/07 Python
python+selenium实现QQ邮箱自动发送功能
2019/01/23 Python
强悍的Python读取大文件的解决方案
2019/02/16 Python
深入浅析Python中的迭代器
2019/06/04 Python
Python使用random模块生成随机数操作实例详解
2019/09/17 Python
Python实现一个简单的毕业生信息管理系统的示例代码
2020/06/08 Python
好药师网上药店:安全合法的网上药品零售药房
2017/02/15 全球购物
俄罗斯领先的移动和数字设备在线商店:Svyaznoy.ru
2020/12/21 全球购物
联强国际笔试题面试题
2013/07/10 面试题
报关简历自我评价怎么写
2013/09/19 职场文书
情侣吵架检讨书
2014/02/05 职场文书
超市促销活动总结
2014/07/01 职场文书
《中国梦我的梦》小学生演讲稿
2014/08/20 职场文书
创新社会管理心得体会
2014/09/12 职场文书
三十年同学聚会感言
2015/07/30 职场文书
Oracle11g R2 安装教程完整版
2021/06/04 Oracle
详解SpringBoot异常处理流程及原理
2021/06/21 Java/Android
浅谈MySQL表空间回收的正确姿势
2021/10/05 MySQL
Oracle中update和select 关联操作
2022/01/18 Oracle