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服务添加 iptables防火墙策略的方案
Apr 29 MySQL
仅用一句SQL更新整张表的涨跌幅、涨跌率的解决方案
May 06 MySQL
MySQL触发器的使用
May 24 MySQL
MySQL七种JOIN类型小结
Oct 24 MySQL
MySQL笔记 —SQL运算符
Jan 18 MySQL
Mysql分库分表之后主键处理的几种方法
Feb 15 MySQL
MySQL派生表联表查询实战过程
Mar 20 MySQL
Mysql分析设计表主键为何不用uuid
Mar 31 MySQL
为什么MySQL不建议使用SELECT *
Apr 03 MySQL
使用Mysql计算地址的经纬度距离和实时位置信息
Apr 29 MySQL
Mysql中@和@@符号的详细使用指南
Jun 05 MySQL
mysql函数之截取字符串的实现
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
php实现Mongodb自定义方式生成自增ID的方法
2015/03/23 PHP
php 读写json文件及修改json的方法
2018/03/07 PHP
php成功操作redis cluster集群的实例教程
2019/01/13 PHP
PHP+MySQL实现在线测试答题实例
2020/01/02 PHP
自己的js工具 Cookie 封装
2009/08/21 Javascript
理解Javascript_14_函数形式参数与arguments
2010/10/20 Javascript
JavaScript判断变量是否为空的自定义函数分享
2015/01/31 Javascript
学习JavaScript设计模式之状态模式
2016/01/08 Javascript
超实用的javascript时间处理总结
2016/08/16 Javascript
slideToggle+slideup实现手机端折叠菜单效果
2017/05/25 Javascript
详解如何使用webpack打包Vue工程
2017/05/27 Javascript
在Vue中使用echarts的实例代码(3种图)
2017/07/10 Javascript
在Vue methods中调用filters里的过滤器实例
2018/08/30 Javascript
通过vue-cli3构建一个SSR应用程序的方法
2018/09/13 Javascript
微信小程序一周时间表功能实现
2019/10/17 Javascript
python装饰器初探(推荐)
2016/07/21 Python
python数据清洗系列之字符串处理详解
2017/02/12 Python
python 表达式和语句及for、while循环练习实例
2017/07/07 Python
对numpy的array和python中自带的list之间相互转化详解
2018/04/13 Python
利用Python实现手机短信监控通知的方法
2019/07/22 Python
使用python实现unix2dos和dos2unix命令的例子
2019/08/13 Python
python颜色随机生成器的实例代码
2020/01/10 Python
使用Python爬虫库requests发送请求、传递URL参数、定制headers
2020/01/25 Python
Python OpenCV读取显示视频的方法示例
2020/02/20 Python
Django实现celery定时任务过程解析
2020/04/21 Python
Django框架请求生命周期实现原理
2020/11/13 Python
骆驼官方商城:CAMEL
2016/11/22 全球购物
选购世界上最好的美妆品:Cult Beauty
2017/11/03 全球购物
学生拾金不昧表扬信
2014/01/21 职场文书
电大本科自我鉴定
2014/02/05 职场文书
优质护理服务演讲稿
2014/05/07 职场文书
2014年安全生产责任书
2014/07/22 职场文书
实习生矿工检讨书
2014/10/13 职场文书
中学教师个人总结
2015/02/10 职场文书
pytorch 如何把图像数据集进行划分成train,test和val
2021/05/31 Python
Go语言 详解net的tcp服务
2022/04/14 Golang