聚簇索引与非聚簇索引b+树实现的区别

文章目录

  • 聚簇索引
  • 非聚簇索引
  • B+树中聚簇索引的查找(匹配)逻辑
  • B+树中非聚簇索引的查找(匹配)逻辑


在这里插入图片描述

聚簇索引

特点:

  • 索引和数据保存在同一个B+树中

  • 页内的记录是按照主键的大小顺序排成一个单向链表

  • 页和页之间也是根据页中记录的主键的大小顺序排成一个双向链表

  • 非叶子节点存储的是记录的主键+页号

  • 叶子节点存储的是完整的用户记录

优点:

  • 数据访问更快 ,因为索引和数据保存在同一个B+树中,因此从聚簇索引中获取数据比非聚簇索引更快。
  • 聚簇索引对于主键的排序查找范围查找速度非常快。
  • 按照聚簇索引排列顺序,查询显示一定范围数据的时候,由于数据都是紧密相连,数据库可以从更少的数据块中提取数据,节省了大量的IO操作

缺点:

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

限制:

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

非聚簇索引

(二级索引、辅助索引)

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

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

在这里插入图片描述
这个B+树与聚簇索引有几处不同:

  • 页内的记录是按照从c2列的大小顺序排成一个单向链表

  • 页和页之间也是根据页中记录的c2列的大小顺序排成一个双向链表

  • 非叶子节点存储的是记录的c2列+页号

  • 叶子节点存储的并不是完整的用户记录,而只是c2列+主键这两个列的值。

B+树中聚簇索引的查找(匹配)逻辑

在这里插入图片描述


B+树中非聚簇索引的查找(匹配)逻辑

例如: 根据c2列的值查找c2=4的记录,查找过程如下:

  1. 根据根页面44定位到页42(因为2 ≤ 4 < 9
  2. 由于c2列没有唯一性约束,所以c2=4的记录可能分布在多个数据页中,又因为 2 ≤ 4 ≤ 4,所以确定实际存储用户记录的页在页34和页35中。
  3. 在页34和35中定位到具体的记录
  4. 但是这个B+树的叶子节点只存储了c2和c1(主键)两个列,所以我们必须再根据主键值去聚簇索引中再查找一遍完整的用户记录。
  5. like 张%

在这里插入图片描述


在这里插入图片描述



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/796066.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法设计与分析实验报告c++java实现(矩阵链连乘、投资问题、完全背包问题、旅行商问题、数字三角形)

一、 实验目的 1&#xff0e;加深学生对算法设计方法的基本思想、基本步骤、基本方法的理解与掌握&#xff1b; 2&#xff0e;提高学生利用课堂所学知识解决实际问题的能力&#xff1b; 3&#xff0e;提高学生综合应用所学知识解决实际问题的能力。 二、实验任务 用动态规…

力扣回溯篇

文章目录 46.全排列78.子集17.电话号码的字母组合39.组数总和79.单词搜索131.分割回文子串 46.全排列 给定一个不含重复数字的数组 nums &#xff0c;返回其所有可能的全排列 。你可以按任意顺序返回答案。 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],…

Linux:IO多路转接之poll

文章目录 select的缺点pollstruct pollfd解决缺点的方式 代码实现 本篇总结的是poll的相关内容&#xff0c;在总结poll的内容前&#xff0c;先回顾一下select的缺点 select的缺点 select的缺点也比较明显 等待的fd是有上限的&#xff0c;在我们当前这个版本来说&#xff0c;…

【AOSP】手把手教你编译和调试AOSP源码

一、下载AOSP源码 在开始之前&#xff0c;我们先安装编译AOSP需要的一些系统基本依赖&#xff0c;如下命令 sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g-multilib libc6-dev-i386 lib32ncurses5-dev x11proto…

Shell快捷键大全

Shell快捷键大全 快捷键操作控制命令&#xff1a;Ctrl C中断当前正在运行的命令Ctrl Z挂起当前正在运行的命令Ctrl L清屏编辑命令&#xff1a;Ctrl U删除光标之前的内容Ctrl K删除光标之后的内容Ctrl W删除光标之前的一个单词Ctrl Y粘贴之前使用Ctrl U&#xff0c;Ctr…

【图论】【分类讨论】LeetCode3017按距离统计房屋对数目

本文涉及的知识点 图论 分类讨论 本题同解 【差分数组】【图论】【分类讨论】【整除以2】3017按距离统计房屋对数目 LeetCode3017按距离统计房屋对数目 给你三个 正整数 n 、x 和 y 。 在城市中&#xff0c;存在编号从 1 到 n 的房屋&#xff0c;由 n 条街道相连。对所有 …

字节跳动2024春招内幕:Python itertools面试题大全(超全面!超详细!)绝对值得收藏!

在面对2024年字节跳动的Python开发岗位春季招聘时&#xff0c;深入了解和熟练应用Python标准库中的itertools模块成为了每位求职者不可回避的挑战。作为Python中处理迭代数据的利器&#xff0c;itertools不仅提供了一系列高效、优雅的工具来创建和操作迭代器&#xff0c;而且其…

MBTI测试在职场:如何与不同性格类型的同事相处?(包含开源免费的API)

MBTI简介 MBTI的全名是Myers-Briggs Type Indicator。它是一种迫选型、自我报告式的性格评估工具&#xff0c;用以衡量和描述人们在获取信息、作出决策、对待生活等方面的心理活动规律和性格类型。 差异简介 MBTI倾向显示了人与人之间的差异&#xff0c;而这些差异产生于&…

AcWing 1101.献给阿尔吉侬的花束

思路&#xff1a;BFS 这里不用BFS进行遍历了&#xff0c;这里实验一种比较高效的BFS遍历&#xff1a;双向BFS。 其实这个双向BFS很简单&#xff0c;也就是说我们只要知道了终点和起点&#xff0c;这两个并不能少其中一个&#xff0c;这样我们就可以用双向BFS来节省时间。 下…

Centos7下docker安装jenkins【使用docker-compose图文教程】

个人记录 前置条件&#xff1a;安装Docker与Docker-compose Centos7安装Docker与Docker-compose【图文教程】 查看jenkins最新的版本 https://www.jenkins.io/download/ 配置docker-compose.yml vim docker-compose.yml按i进行编辑模式&#xff0c;粘贴如下内容。把image里…

【SQLServer】快速查看SQL Server中所有数据库中所有表的行数

1.查看某个数据库中每个表的行数 SELECT @@servername as servername, db_name() as databasename, s.name AS schemaname, t.name AS tablename,p.rows AS rowcounts,SUM(a

11-pyspark的RDD的变换与动作算子总结

目录 前言 变换算子动作算子 前言 一般来说&#xff0c;RDD包括两个操作算子&#xff1a; 变换&#xff08;Transformations&#xff09;&#xff1a;变换算子的特点是懒执行&#xff0c;变换操作并不会立刻执行&#xff0c;而是需要等到有动作&#xff08;Actions&#xff09;…

java(7)之跳转语句

1、break跳转语句 说到break其实也不是跳转&#xff0c;它更像是一个终结语句&#xff0c;常用于在循环语句需要停止出现例如 while&#xff08;&#xff09;{ if&#xff08;&#xff09;{ break&#xff1b; }} 这样的形式或者 switch&#xff08;&#xff09;{ case…

Flutter 关键字

import ‘package:xxxx.dart’; //源于pub.dev (完美的相对引入) import ‘xxxx.dart’; //自定义文件(库)(参考的相对引入(填写import命令码所在文件的上级文件夹下的文件(库)相对路径))(受到import命令码所在文件的参考路径的影响) import&#xff1a;import不具有传递性(类似…

蓝桥 python笔记14——KMP、字符串哈希、最长回文子串、字典树

目录 KMP 字符串哈希 最长回文子串 字典树 KMP 模式匹配问题&#xff1a; KMP算法&#xff1a; 用动规的思想求Next数组&#xff1a;如果后缀的i位置前缀的j位置&#xff0c;Next[i1]j1&#xff1b;如果后缀的i位置!前缀的j位置&#xff0c;那就用KMP算法&#xff0c;令jNe…

OpenCV图像处理——基于背景减除实现多目标追踪

1. 基本运动检测 基本运动检测方法的核心在于计算视频帧之间的差异&#xff0c;或者是将某一帧设定为“背景”&#xff0c;然后将其与后续的帧进行比较。这个过程在概念上非常简单&#xff1a;首先保存视频的第一帧作为背景参考&#xff0c;随后将这一帧与新接收到的帧进行逐像…

肖恩带你学C语言·文件操作(上)

1. 为什么使用文件 如果没有文件&#xff0c;我们写的程序的数据是存储在电脑的内存中&#xff0c;如果程序退出&#xff0c;内存回收&#xff0c;数据就丢失了&#xff0c;等再次运行程序&#xff0c;是看不到上次程序的数据的&#xff0c;如果要将数据进行持久化的保存&…

【攻防世界】FlatScience

dirsearch 扫描发现四个文件 在login.php 中发现 输入 http://61.147.171.105:61912/login.php/?debug 发现源码 <?php if(isset($_POST[usr]) && isset($_POST[pw])){$user $_POST[usr];$pass $_POST[pw];$db new SQLite3(../fancy.db);$res $db->query(…

艺术史话:石膏像绘画是如何进入素描绘画教育的

石膏像绘画进入素描绘画教育的历史可以追溯到欧洲文艺复兴时期。在那个时代&#xff0c;艺术家们开始对人体解剖学和比例进行深入研究&#xff0c;以更准确地表现人物形象。石膏像作为一种教学工具&#xff0c;被广泛应用于素描绘画教育中。 石膏像通常是由古希腊和古罗马时期…

Android 360度全景图功能

方法一&#xff1a;OpenGL ES 1.在build.gradle文件中添加依赖 allprojects {repositories {maven { url https://jitpack.io }} } 高版本AS中settings.gradle.kts&#xff1a; dependencyResolutionManagement {repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_RE…