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慢查询的坑
Apr 28 MySQL
MySQL系列之一 MariaDB-server安装
Jul 02 MySQL
MySQL图形化管理工具Navicat安装步骤
Dec 04 MySQL
mysql 获取时间方式
Mar 20 MySQL
MySQL去除密码登录告警的方法
Apr 20 MySQL
Mysql索引失效 数据库表中有索引还是查询很慢
May 15 MySQL
Mysql开启外网访问
May 15 MySQL
关于mysql中string和number的转换问题
Jun 14 MySQL
MySQL数据库之存储过程 procedure
Jun 16 MySQL
MySQL中正则表达式(REGEXP)使用详解
Jul 07 MySQL
MySQL提升大量数据查询效率的优化神器
Jul 07 MySQL
jdbc中自带MySQL 连接池实践示例
Jul 23 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.ini 配置文件的深入解析
2013/06/17 PHP
PHP之十六个魔术方法详细介绍
2016/11/01 PHP
Ajax一统天下之Dojo整合篇
2007/03/24 Javascript
JavaScript之自定义类型
2012/05/04 Javascript
js 动态修改css文件的方法
2014/08/05 Javascript
JS实现支持多选的遍历下拉列表代码
2015/08/20 Javascript
分享我的jquery实现下拉菜单心的
2015/11/29 Javascript
jQuery easyui的validatebox校验规则扩展及easyui校验框validatebox用法
2016/01/18 Javascript
js实现加载更多功能实例
2016/10/27 Javascript
Nodejs实现短信验证码功能
2017/02/09 NodeJs
jQuery遮罩层实例讲解
2017/05/11 jQuery
vue项目总结之文件夹结构配置详解
2017/12/13 Javascript
利用vue和element-ui设置表格内容分页的实例
2018/03/02 Javascript
教你如何用node连接redis的示例代码
2018/07/12 Javascript
详解在React项目中安装并使用Less(用法总结)
2019/03/18 Javascript
vue-cli3 配置开发与测试环境详解
2019/05/17 Javascript
原生js+css调节音量滑块
2020/01/15 Javascript
详解Typescript 内置的模块导入兼容方式
2020/05/31 Javascript
Vue项目配置跨域访问和代理proxy设置方式
2020/09/08 Javascript
Python代码调试的几种方法总结
2015/04/15 Python
CentOS中升级Python版本的方法详解
2017/07/10 Python
详解使用python绘制混淆矩阵(confusion_matrix)
2019/07/14 Python
python scrapy爬虫代码及填坑
2019/08/12 Python
Anaconda和ipython环境适配的实现
2020/04/22 Python
CSS3实现鼠标悬停显示扩展内容
2016/08/24 HTML / CSS
美国知名生活购物网站:Goop
2017/11/03 全球购物
什么是组件架构
2016/05/15 面试题
总经理助理工作职责
2014/02/06 职场文书
生育关怀行动实施方案
2014/03/26 职场文书
啤酒节策划方案
2014/05/28 职场文书
2015年导购员工作总结
2015/04/25 职场文书
2015年电教工作总结
2015/05/26 职场文书
观看安全警示教育片心得体会
2016/01/15 职场文书
Nginx配置SSL证书出错解决方案
2021/03/31 Servers
一次项目中Thinkphp绕过禁用函数的实战记录
2021/11/17 PHP
python单向链表实例详解
2022/05/25 Python