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 相关文章推荐
Windows10下安装MySQL8
Apr 06 MySQL
mysql死锁和分库分表问题详解
Apr 16 MySQL
MySQL 逻辑备份与恢复测试的相关总结
May 14 MySQL
Mysql数据库命令大全
May 26 MySQL
mysql如何配置白名单访问
Jun 30 MySQL
MYSQL 运算符总结
Nov 11 MySQL
MySQL窗口函数的具体使用
Nov 17 MySQL
详细聊一聊mysql的树形结构存储以及查询
Apr 05 MySQL
mysql 子查询的使用
Apr 28 MySQL
mysql如何查询连续记录
May 11 MySQL
MySQL解决Navicat设置默认字符串时的报错问题
Jun 16 MySQL
MySQL 原理与优化之Update 优化
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
libmysql.dll与php.ini是否真的要拷贝到c:\windows目录下呢
2010/03/15 PHP
php mysql 封装类实例代码
2016/09/18 PHP
PHP实现针对日期,月数,天数,周数,小时,分,秒等的加减运算示例【基于strtotime】
2017/04/19 PHP
Prototype使用指南之string.js
2007/01/10 Javascript
jQuery 中关于CSS操作部分使用说明
2007/06/10 Javascript
jQuery技巧大放送 学习jquery的朋友可以看下
2009/10/14 Javascript
JavaScript在XHTML中的用法详解
2013/04/11 Javascript
JQuery中serialize()、serializeArray()和param()方法示例介绍
2014/07/31 Javascript
jQuery实现图片加载完成后改变图片大小的方法
2016/03/29 Javascript
浅析JavaScript的几种Math函数,random(),ceil(),round(),floor()
2016/12/22 Javascript
layer弹出层中H5播放器全屏出错的解决方法
2017/02/21 Javascript
使用vue-resource进行数据交互的实例
2017/09/02 Javascript
zTree jQuery 树插件的使用(实例讲解)
2017/09/25 jQuery
webpack+vue中使用别名路径引用静态图片地址
2017/11/20 Javascript
vue 权限认证token的实现方法
2018/07/17 Javascript
JavaScript实现简单随机点名器
2019/11/21 Javascript
JavaScript this关键字指向常用情况解析
2020/09/02 Javascript
python更新列表的方法
2015/07/28 Python
Python爬虫实现全国失信被执行人名单查询功能示例
2018/05/03 Python
Python基于jieba库进行简单分词及词云功能实现方法
2018/06/16 Python
python进行TCP端口扫描的实现
2018/12/21 Python
Python整数对象实现原理详解
2019/07/01 Python
python 统计文件中的字符串数目示例
2019/12/24 Python
python matplotlib 绘图 和 dpi对应关系详解
2020/03/14 Python
vue常用指令代码实例总结
2020/03/16 Python
Python的信号库Blinker用法详解
2020/12/31 Python
Python使用paramiko连接远程服务器执行Shell命令的实现
2021/03/04 Python
Ivory Isle Designs美国/加拿大:婚礼和活动文具公司
2018/08/21 全球购物
优秀毕业大学生推荐信
2013/11/13 职场文书
党员承诺书内容
2014/03/26 职场文书
党员教师批评与自我批评发言稿
2014/10/15 职场文书
2015年“我们的节日·重阳节”活动总结
2015/07/29 职场文书
2020优秀员工演讲稿(三篇)
2019/10/17 职场文书
JavaScript+HTML实现学生信息管理系统
2021/04/20 Javascript
go类型转换及与C的类型转换方式
2021/05/05 Golang
Mysql数据库表中为什么有索引却没有提高查询速度
2022/02/24 MySQL