聚簇索引和非聚簇索引到底有什么区别?
在 MySQL 的 InnoDB 引擎中,每个索引都会对应一颗 B+ 树,而聚簇索引和非聚簇索引最大的区别在于叶子节点存储的数据不同,聚簇索引叶子节点存储的是行数据,因此通过聚簇索引可以直接找到真正的行数据。 |
在 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+ 树如下图所示:
在聚簇索引的叶子节点直接存储用户信息的内存地址,我们使用内存地址可以直接找到相应的行数据。
非聚簇索引
非聚簇索引在 InnoDB 引擎中,也叫二级索引,以上面 student 表为例,在 student 中非聚簇索引 class_id 对应 B+ 树如下图所示:
从上图我们可以看出,在非聚簇索引的叶子节点上存储的并不是真正的行数据,而是主键 ID,所以当我们使用非聚簇索引进行查询时,首先会得到一个主键 ID,然后再使用主键 ID 去聚簇索引上找到真正的行数据,我们把这个过程称之为回表查询。
总结
在 MySQL 的 InnoDB 引擎中,每个索引都会对应一颗 B+ 树,而聚簇索引和非聚簇索引最大的区别在于叶子节点存储的数据不同,聚簇索引叶子节点存储的是行数据,因此通过聚簇索引可以直接找到真正的行数据;而非聚簇索引叶子节点存储的是主键信息,所以使用非聚簇索引还需要回表查询,因此我们可以得出聚簇索引和非聚簇索引的区别主要有以下几个:
- 聚簇索引叶子节点存储的是行数据;而非聚簇索引叶子节点存储的是聚簇索引(通常是主键 ID)。
- 聚簇索引查询效率更高,而非聚簇索引需要进行回表查询,因此性能不如聚簇索引。
- 聚簇索引一般为主键索引,而主键一个表中只能有一个,因此聚簇索引一个表中也只能有一个,而非聚簇索引则没有数量上的限制。
聚簇索引和非聚簇索引到底有什么区别?相关推荐
- 聚簇索引与非聚簇索引的区别以及SQL Server查询优化技术
在<数据库原理>里面,对聚簇索引的解释是:聚簇索引的顺序就是数据的物理存储顺序,而对非聚簇索引的解释是:索引顺序与数据物理排列顺序无关.正式因为如此,所以一个表最多只能有一个聚簇索引. 不 ...
- 聚簇索引和非聚簇索引的区别_学习索引的一些总结
一.什么是索引 索引其实是一种数据结构,其作用类似于书的目录. 好处是 减少数据的扫描数量,提高查询效率. 将随见IO变为顺序IO 缺点是: 随着数据量的变大,索引的存储空间也变大 维护和修改索引,成 ...
- Mysql数据库索引的理解及聚簇索引和非聚簇索引的区别
Mysql数据库索引的理解及聚簇索引和非聚簇索引的区别 概念 索引是帮助Mysql搞笑获取数据的数据结构 对Mysql数据库来讲,其核心就是存储引擎,而索引就是属于存储引擎级别的概念,不同的存储引擎对 ...
- 索引、单列索引、复合索引、主键、唯一索引、聚簇索引、非聚簇索引、唯一聚簇索引 的区别与联系
B树与红黑树最广泛的应用就是数据库索引,熟练使用索引是程序员最重要的基本功之一.索引的数据结构可以是树,也可以是哈希表.常用的数据库都是树结构的索引,本篇的背景也全部以树结构的索引为前提.本文旨在梳理 ...
- 聚簇索引和非聚簇索引区别
聚簇索引和非聚簇索引区别 MySQL的聚簇索引是指Innodb引擎的特性,MySIAM并没有,如果需要该索引,只要将索引指定为主键(primary key)就可以了. 聚集(clustered)索引, ...
- MySQL索引:聚簇索引和非聚簇索引的区别
目录 1.聚簇索引和非聚簇索引的概念 2.两者详细介绍 2.1 聚簇索引 2.2 非聚簇索引 3. 两者的区别 3.1 数据存储方式 3.2 二级索引查询 1.聚簇索引和非聚簇索引的概念 数据库表的索 ...
- Mysql 聚簇索引和非聚簇索引的区别
聚簇索引是对磁盘上实际数据重新组织以按指定的一个或多个列的值排序的算法.特点是存储数据的顺序和索引顺序一致. 一般情况下主键会默认创建聚簇索引,且一张表只允许存在一个聚簇索引. 在<数据库原理& ...
- mysql 聚簇索引和非聚簇索引_MySql聚簇索引与非聚簇索引的区别
通常情况下,建立索引是加快查询速度的有效手段.但索引不是万能的,靠索 引并不能实现对所有数据的快速存取.事实上,如果索引策略和数据检索需求严重不符的话,建立索引反而会降低查询性能.因此在实际使用当中, ...
- 面试突击MySQL聚簇索引和非聚簇索引有什么区别?
一.聚簇索引和非聚簇索引 1.聚簇索引和非聚簇索引: 我拿查字典做一个比喻,字典的页面就好比是物理排列顺序,物理排列顺序是固定的,查询的方式就好比是索引,区别是聚簇索引就好比是拼音查询,每一个字母查询 ...
最新文章
- 用supervisord管理杂乱的服务
- Apache 超详细编译参数解析
- Confluence 6 可以自定义的元素
- Esxi服务器虚拟化平台搭建
- MySQL数据库备份和还原的常用命令
- Python 基础教程:位运算的奥妙
- shell题库选择题_linux操作题及答案 shell练习题
- Codeforces Round #723 (Div. 2)
- 为什么说php单线程,php单线程的缺点是什么?
- gpt efi win7 linux,科学网—UEFI+GPTSSD+HDD 成功安装win10+Centos linux7 过程 - 陈长云的博文...
- Linux系统Bash的常用功能(9)
- Javascript 操作二进制数据
- C++ STL bitset类常用函数的使用
- Spring源码解析:Spring Aware 原理解析
- 单片机自学入门必看基础知识
- Scratch(三十三):打砖游戏
- mysql 生日排序 查询生日由近到远 按照生日排序
- 极致CMS v1.7版本-一款完全开源,免授权商用,功能强大的PHP建站系统
- 广成子:值得收藏-史上最全Linux ps命令详解
- 怎么把qlv格式转换成mp4?快速转换qlv格式的方法