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字段要使用NOT NULL
May 13 MySQL
MySQL中使用or、in与union all在查询命令下的效率对比
May 26 MySQL
MySQL分库分表详情
Sep 25 MySQL
MySQL分区表实现按月份归类
Nov 01 MySQL
MySQL Innodb索引机制详细介绍
Nov 23 MySQL
面试中老生常谈的MySQL问答集锦夯实基础
Mar 13 MySQL
mysql数据插入覆盖和时间戳的问题及解决
Mar 25 MySQL
聊聊mysql都有哪几种分区方式
Apr 13 MySQL
MySQL时区造成时差问题
Apr 13 MySQL
MySQL 数据库 增删查改、克隆、外键 等操作
May 11 MySQL
MySQL的表级锁,行级锁,排它锁和共享锁
Jul 15 MySQL
DQL数据查询语句使用示例
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
php安全配置 如何配置使其更安全
2011/12/16 PHP
zf框架db类的分页示例分享
2014/03/14 PHP
xss防御之php利用httponly防xss攻击
2014/03/21 PHP
9个比较实用的php代码片段
2016/03/15 PHP
php调用自己java程序的方法详解
2016/05/13 PHP
YII框架学习笔记之命名空间、操作响应与视图操作示例
2019/04/30 PHP
PHP实现的62进制转10进制,10进制转62进制函数示例
2019/06/06 PHP
一个javascript图片阅览组件
2010/11/09 Javascript
JS数组的遍历方式for循环与for...in
2014/07/31 Javascript
jQuery浏览器CSS3特写兼容实例
2015/01/19 Javascript
js控制文本框只输入数字和小数点的方法
2015/03/10 Javascript
浅谈Javascript线程及定时机制
2015/07/02 Javascript
jquery专业的导航菜单特效代码分享
2015/08/29 Javascript
jquery中取消和绑定hover事件的实现代码
2016/06/02 Javascript
Jquery AJAX POST与GET之间的区别详细介绍
2016/10/17 Javascript
手机注册发送验证码倒计时的简单实例
2017/11/15 Javascript
基于layui数据表格以及传数据的方式
2018/08/19 Javascript
Node.js 实现抢票小工具 & 短信通知提醒功能
2019/10/22 Javascript
python基础教程之字典操作详解
2014/03/25 Python
将Python中的数据存储到系统本地的简单方法
2015/04/11 Python
Python编程实现数学运算求一元二次方程的实根算法示例
2017/04/02 Python
学习Python3 Dlib19.7进行人脸面部识别
2018/01/24 Python
使用 Python 玩转 GitHub 的贡献板(推荐)
2019/04/04 Python
Python语言进阶知识点总结
2019/05/28 Python
python序列化与数据持久化实例详解
2019/12/20 Python
python如何导出微信公众号文章方法详解
2020/08/31 Python
python opencv实现直线检测并测出倾斜角度(附源码+注释)
2020/12/31 Python
详解Canvas事件绑定
2018/06/27 HTML / CSS
韩国CJ食品专卖网:CJonmart
2016/09/11 全球购物
adidas爱尔兰官方网站:阿迪达斯运动鞋和运动服
2019/11/01 全球购物
亿阳信通股份有限公司C#笔试题
2016/12/06 面试题
乡镇总工会学雷锋活动总结
2014/03/01 职场文书
2014年五四青年节演讲稿范文
2014/04/22 职场文书
教研活动总结
2014/04/28 职场文书
2016党员干部廉洁自律心得体会
2016/01/13 职场文书
演讲开头怎么书写?
2019/08/06 职场文书