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慢查询的坑
Apr 28 MySQL
MySQL中日期型单行函数代码详解
Jun 21 MySQL
MySQL修改默认引擎和字符集详情
Sep 25 MySQL
MYSQL 运算符总结
Nov 11 MySQL
一次Mysql update sql不当引起的生产故障记录
Apr 01 MySQL
MySQL提取JSON字段数据实现查询
Apr 22 MySQL
MySQ InnoDB和MyISAM存储引擎介绍
Apr 26 MySQL
Mysql 一主多从的部署
May 20 MySQL
Mysql中@和@@符号的详细使用指南
Jun 05 MySQL
MySQL 原理与优化之原数据锁的应用
Aug 14 MySQL
MySQL实现用逗号进行拼接、以逗号进行分割
Dec 24 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
防止本地用户用fsockopen DDOS攻击对策
2011/11/02 PHP
php使用mkdir创建多级目录入门例子
2014/05/10 PHP
简单谈谈favicon
2015/06/10 PHP
PHP JWT初识及其简单示例
2018/10/10 PHP
一个选择最快的服务器转向代码
2009/04/27 Javascript
Jquery Ajax学习实例5 向WebService发出请求,返回泛型集合数据的异步调用
2010/03/17 Javascript
各浏览器对link标签onload/onreadystatechange事件支持的差异分析
2011/04/27 Javascript
document.getElementBy("id")与$("#id")有什么区别
2013/09/22 Javascript
easyui Draggable组件实现拖动效果
2015/08/19 Javascript
JavaScript实现向右伸出的多级网页菜单效果
2015/08/25 Javascript
基于jquery实现鼠标滚轮驱动的图片切换效果
2015/10/26 Javascript
全面解析Bootstrap表单使用方法(表单按钮)
2015/11/24 Javascript
JavaScript中的函数(二)
2015/12/23 Javascript
JQuery datepicker 用法详解
2015/12/25 Javascript
Javascript 字符串模板的简单实现
2016/02/13 Javascript
第一次接触JS require.js模块化工具
2016/04/17 Javascript
Vue.js组件tabs实现选项卡切换效果
2016/12/01 Javascript
jQuery滑动到底部加载下一页数据的实例代码
2017/05/22 jQuery
webpack构建vue项目的详细教程(配置篇)
2017/07/17 Javascript
ionic选择多张图片上传的示例代码
2017/10/10 Javascript
angularjs通过过滤器返回超链接的方法
2018/10/26 Javascript
es6中比较有用的7个技巧小结
2019/07/12 Javascript
jQuery实现弹出层效果
2019/12/10 jQuery
解决Vue中的生命周期beforeDestory不触发的问题
2020/07/21 Javascript
在Docker上开始部署Python应用的教程
2015/04/17 Python
django admin后管定制-显示字段的实例
2020/03/11 Python
Python接收手机短信的代码整理
2020/08/02 Python
Superdry瑞典官网:英国日本街头风品牌
2017/05/17 全球购物
英国豪华文具和皮具配件经典老品牌:Smythson(斯迈森)
2018/04/19 全球购物
英国知名美妆护肤在线商城:Zest Beauty
2018/04/24 全球购物
东南亚排名第一的服务市场:kaodim
2019/03/28 全球购物
高等教育学自荐书范文
2014/02/10 职场文书
教书育人演讲稿
2014/09/11 职场文书
2014年校务公开工作总结
2014/12/18 职场文书
爱晚亭导游词
2015/02/09 职场文书
Python获取百度热搜的完整代码
2021/04/07 Python