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 相关文章推荐
浅析InnoDB索引结构
Apr 05 MySQL
mysql对于模糊查询like的一些汇总
May 09 MySQL
详解MySQL连接挂死的原因
May 18 MySQL
mysql优化之query_cache_limit参数说明
Jul 01 MySQL
mysql连接查询中and与where的区别浅析
Jul 01 MySQL
SQL实现LeetCode(178.分数排行)
Aug 04 MySQL
MySQL修炼之联结与集合浅析
Oct 05 MySQL
mysql timestamp比较查询遇到的坑及解决
Nov 27 MySQL
MySQL数据库查询进阶之多表查询详解
Apr 08 MySQL
mysql中关键词exists的用法实例详解
Jun 10 MySQL
MySQL控制流函数(-if ,elseif,else,case...when)
Jul 07 MySQL
详解MySQL的内连接和外连接
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中文件上传的一个问题
2010/09/04 PHP
php笔记之:数据类型与常量的使用分析
2013/05/14 PHP
Thinkphp的volist标签嵌套循环使用教程
2014/07/08 PHP
codeigniter实现get分页的方法
2015/07/10 PHP
PHP环形链表实现方法示例
2017/09/15 PHP
javascript基础知识大集锦(二) 推荐收藏
2011/01/13 Javascript
Jquery ajax传递复杂参数给WebService的实现代码
2011/08/08 Javascript
JavaScript中三种常见的排序方法
2017/02/24 Javascript
详解如何使用Node.js编写命令工具——以vue-cli为例
2017/06/29 Javascript
Node.js pipe实现源码解析
2017/08/12 Javascript
vue异步axios获取的数据渲染到页面的方法
2018/08/09 Javascript
详解angular2.x创建项目入门指令
2018/10/11 Javascript
JavaScript学习笔记之DOM基础操作实例小结
2019/01/09 Javascript
layui 选择列表,打勾,点击确定返回数据的例子
2019/09/02 Javascript
vue iview实现动态新增和删除
2020/06/17 Javascript
[01:06:54]DOTA2-DPC中国联赛 正赛 RNG vs Dragon BO3 第一场 1月24日
2021/03/11 DOTA
python常用web框架简单性能测试结果分享(包含django、flask、bottle、tornado)
2014/08/25 Python
Python3实现的画图及加载图片动画效果示例
2018/01/19 Python
python logging添加filter教程
2019/12/24 Python
pytorch 常用函数 max ,eq说明
2020/06/28 Python
Html5 APP中监听返回事件处理的方法示例
2018/03/15 HTML / CSS
荷兰超市:DEEN
2018/03/14 全球购物
美国在线打印网站:Overnight Prints
2018/10/11 全球购物
英国领先的酒杯和水晶玻璃器皿制造商:Dartington Crystal
2019/06/23 全球购物
VC++笔试题
2014/10/13 面试题
工业设计专业个人求职信范文
2013/12/28 职场文书
语文教学随笔感言
2014/02/18 职场文书
应届毕业生应聘自荐信范文
2014/02/26 职场文书
学术会议主持词
2014/03/17 职场文书
2014年安全生产目标责任书
2014/07/23 职场文书
优秀教师事迹材料
2014/12/15 职场文书
餐厅收银员岗位职责
2015/04/07 职场文书
志愿者工作心得体会
2016/01/15 职场文书
大学社团活动总结怎么写
2019/06/21 职场文书
python函数指定默认值的实例讲解
2021/03/29 Python
php双向队列实例讲解
2021/11/17 PHP