Mysql聚簇索引与非聚簇索引B+树实现区别详解

ops/2024/10/20 6:23:45/

聚簇索引

特点:

  • 索引和数据保存在同一个B+树中,
  • 每一页 也就是每一个节点是按照主键的大小顺序排成一个单项链表,
  • B+树的每一层的页与页之间也是根据主键大小顺序排成一个双向链表,
  • 非叶子节点存储的是记录的主键+指向的页号,
  • 叶子节点存储的是完整的用户记录。

优点:

  • 数据的访问快,因为数据就在这个B+树中,比非聚集索引少了回表的操作
  • 聚簇索引对主键的排序查找和范围查找速度很快。因为B+树是按照主键的大小建立的,而且叶子节点是双向链表找左右的数据非常快。
  • 比非聚集索引节省了大量的IO操作

缺点:

  • 插入速度严重依赖于插入的顺序,按照主键的顺序插入是最快的方式,否则将出现页分裂,严重影响性能。因此对于InnoDB,我们一般都会定义一个自增的ID列作为主键
  • 更新的代价高......

限制:

  • 只有InnoDB引擎支持聚簇索引,MyISAM不支持聚簇索引
  • 由于物理排序方式只能有一种,所以每个MySQL的表只能由一个聚簇索引
  • 如果没有为表定义主键,InnoDB会选择非空的唯一索引列代替。如果没有这样的列,InnoDB会自己定义一个 隐式主键 作为聚簇索引
  • 为了充分利用聚簇索引的特性,InnoDB中表应该选择有序的id,不建议使用无序的id,比如UUID、字符串作为索引,这样就无法保证数据的顺序增长。

非聚簇索引:(二级索引、辅助索引)

聚簇索引,只能在所搜条件是主键值是才能发挥作用,因为B+树中的数据都是按照主键进行排序的,如果我们想以别的列作为搜索条件,那么就需要创建非聚簇索引。

例如,以c2列作为搜索条件,那么需要使用c2列创建一棵B+树,如下所示:

这个B+树与聚簇索引的不同点:

  • 页内的记录是按照从c2列的大小顺序排成的一个单项链表。
  • 页和页直接按也是根据页中记录的c2列的大小顺序排成的一个双向链表
  • 非叶子节点存储的是记录的c2列+指向下一层页号
  • 叶子节点存储的并不是完整的用户记录,而只是c2列+主键这两个列的值

一个表中可以有多个非聚簇索引,但是聚簇索引只能有一个。


http://www.ppmy.cn/ops/91603.html

相关文章

大整数求余c++

#include<bits/stdc.h> using namespace std; int main(){string a;long long b;cin>>a>>b;int la.size();long long t0;for(int i0;i<l;i){tt*10(a[i]-0);tt%b;}cout<<t;return 0; } 这段代码a可以输入比long long的最大值&#xff08;9223372036…

Android NDK/JNI面试题大全及参考答案(3万字长文)

目录 什么是NDK?它主要用来做什么? 为什么在Android开发中使用NDK? 描述一下NDK和JDK之间的关系 举出一些使用NDK开发的应用场景 什么是JNI?它如何与NDK配合使用? 如何安装和配置Android NDK? 在Android Studio中如何配置NDK路径? 描述一下NDK工具链中的主要工具…

Redis 7.x 系列【37】旁路缓存模式

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 缓存1.1 数据库缓存1.2 数据一致性 2. 旁路缓存模式2.1 工作原理2.2 四种更新策略2…

mysql 字符串转数组

在 MySQL 中&#xff0c;可以使用内置的字符串函数 SUBSTRING_INDEX() 和 REPLACE() 来实现将字符串转换为数组。 首先&#xff0c;使用 REPLACE() 函数将字符串中的分隔符替换为空格&#xff0c;然后使用 SUBSTRING_INDEX() 函数将字符串按空格分割成多个子字符串。最后&…

【ARM】v8架构programmer guide(3)_ARMv8的寄存器

目录 4.ARMv8 registers 4.1 AArch64 特殊寄存器 4.1.1 Zero register 4.1.2 Stack pointer &#xff08;SP) 4.1.3 Program Counter &#xff08;PC) 4.1.4 Exception Link Register(ELR) 4.1.5 Saved Process Status Register &#xff08;SPSR&#xff09; 4.2 Proc…

springboot给类进行赋初值的四种方式

目录 1. 使用Value和ConfigurationProperties2. 使用PropertySource创建Person.java写一个测试类 3. 使用ImportResourceStudent类创建beans.xml在主类中引入测试 其他心得 1. 使用Value和ConfigurationProperties 这里不加赘述了&#xff0c;前面我也发过&#xff0c;这里就放…

C# 方法的定义

方法的由来 1.方法(method)的前身是C/C语言的函数(function) 方法是面向对象范畴的概念&#xff0c;在非面向对象语言中仍然称为函数 2.永远都是类(或结构体)的成员 C#语言中函数不可能独立于类(或结构体)之外 只有作为类(结构体)的成员时才被称为方法 C中是可以的&#xf…

java线程池解析

文章目录 java线程池newCachedThreadPool&#xff1a;newFixedThreadPool&#xff1a;newScheduledThreadPool&#xff1a;newSingleThreadExecutor&#xff1a; 线程池原理ThreadPoolExecutor工作队列BlockingQueue详解实现BlockingQueue接口的常见类如下&#xff1a; ** CPU …