《MySQL是怎样运行的》快速查询秘籍——B+树索引

 一.引出索引

前面一章我们说出了数据页的结构,但是如果我们要查找某一条记录的话,怎么办呢?

我们前面知道页与页之间是一个双向链表实现的,我们要找的话,是不是要按照这个链表一个一个找下去,然后找到,可行吗?确实可行,但是如果这个表有一亿个数据的话,那就太慢了!

所以就又有人提出建议了,说我们可以先找到那条记录所在页,然后找到那条记录~

那么问题来了怎么找到那条记录所在的页,怎么找到那条记录?

那么我们的索引就出现了

二.索引

我们在这里就正式提出索引这个概念了!那么在此之前我们继续一个小插曲

还记得我们之前说的那个COMPACT格式是不是有一个record_type  next_record

我们回想一下他们有什么作用来这?

record_type:这个就是表示记录得类型,0表示普通记录,2表示Infimum记录,3表示Supermum记录,1表是就是目录项记录

next_record:这个表示的就是从当前记录的真实数据到下一条记录的真实数据的距离

一个比较简单的索引方案

当我们为了要快速定位记录的数据页的时候,我们就要创建这个目录

1.下一个数据页中用户记录的主键值必须要大于上一个数据页中用户记录的主键值

2.给所有页建立一个目录项

页的用户记录中最小的主键就用key来表示,页号我们用page_no表示

对了我们刚刚是不是一点索引没提,这个目录有个别名就叫做索引~

InnoDB的索引方案

InnoDB中的索引使用的数据结构是B+树?学过数据结构的小伙伴肯定有疑问为什么不使用二叉树,为什么不使用红黑树?等等我们现在来解释一下

B+树是多叉树,平衡二叉树、红黑树是二叉树,在同等数据量下,平衡二叉树、红黑树高度更高,磁盘O次数更多,性能更差,而且它们会频繁执行再平衡过程,来保证树形结构平衡。
跳表和B+树相比,跳表在极端情况下会退化为链表,平衡性差,而数据库查询需
要一个可预期的查询时间,并且跳表需要更多的内存。
B树和B+树相比,B树的数据存储在全部节点中,对范围查询不友好。非叶子节点存储了数据,导致内存中难以放下全部非叶子节点。如果内存放不下非叶子节点,那么就意味着查询非叶子节点的时候都需要磁盘IO。
然后我们来说一下B+树的结构~

最上面的节点叫做根节点,然后最下面的叫做叶子节点,中间的叫做非叶子节点

非叶子节点储存这存放着目录项的数据页

叶子节点储存这存放这个用户记录的数据页

他分为两种索引形式

1,聚簇索引

他的特点是是按照主键进行排序的,然后叶子节点中存放的数据是所有列的值

2,二级索引

他的特点是按照自己定义的进行排序,然后叶子节点中存放的数据是索引列+主键

但是他如果想要完整的值的是需要回表,然后进行聚簇索引进行查找的

InnoDB的索引注意事项

1.根节点万年不动

2.非叶子节点目录项记录的唯一性

目录项记录其实是由:

  • 索引列的值
  • 主键值
  • 页号

3.一个页面至少储存两条记录

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据链路层简单介绍

mac地址(物理地址) mac地址和ip地址,目的都是为了区分网络上的不同设备的,在最开始的时候,mac地址和ip地址是两伙人,独立各自提出的,ip地址是4个字节(早都不够用了)&…

【个人商业画布】你有思考过把自己当成一家公司来经营吗?

商业模式画布(Business Model Canvas),是亚历山大奥斯特瓦德在《商业模式新生代》中提出的一种用于描述商业模式、可视化商业模式、评估商业模式以及改变商业模式的通用语言。它由9个模块构成,帮助创业者理清为“细分客户提供独有价值”,从而…

PersonalLLM——探索LLM是否能根据五大人格特质重新塑造一个新的角色?

1.概述 近年来,大型语言模型(LLMs),例如ChatGPT,致力于构建能够辅助人类的个性化人工智能代理,这些代理以进行类似人类的对话为重点。在学术领域,尤其是社会科学中,一些研究报告已经…

溪谷联运SDK功能全面解析

近期,备受用户关注的手游联运10.0.0版本上线了,不少用户也选择了版本更新,其中也再次迎来了SDK的更新。溪谷软件和大家一起盘点一下溪谷SDK的功能都有哪些吧。 一、溪谷SDK具有完整的运营功能和高度扩展性 1.登录:登录是SDK最基础…

简述MyBatis中#{}引用和${}引用的区别

各位大佬光临寒舍,希望各位能赏脸给个三连,谢谢各位大佬了!!! 目录 1.有无预编译 优点 缺点 2.SQL执行的快慢 3.能否被SQL注入 4.参数输入方式 5.总结 1.有无预编译 #{}是有预编译的而${}是没有预编译的&…

OceanBase集群如何进行OCP的替换

有OceanBase社区版的用户提出替换 OCP 管控平台的需求。举例来说,之前的OCP平台采用单节点,然而随着OceanBase集群的陆续上线和数量的不断增多,担心单节点的OCP可能面临故障风险,而丧失对OceanBase集群的管控能力。另此外&#xf…

创建vue工程、Vue项目的目录结构、Vue项目-启动、API风格

环境准备 介绍:create-vue是Vue官方提供的最新的脚手架工具,用于快速生成一个工程化的Vue项目create-vue提供如下功能: 统一的目录结构 本地调试 热部署 单元测试 集成打包依赖环境:NodeJS 安装NodeJS 一、 创建vue工程 npm 类…

以Linux为例了解线程

我最近开了几个专栏,诚信互三! > |||《算法专栏》::刷题教程来自网站《代码随想录》。||| > |||《C专栏》::记录我学习C的经历,看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

IO系列(八) -浅析NIO工作原理

一、简介 现在使用 NIO 的场景越来越多,很多网上的技术框架或多或少的使用 NIO 技术,譬如 Tomcat、Jetty、Netty,学习和掌握 NIO 技术已经不是一个 Java 攻城狮的加分技能,而是一个必备技能。 那什么是 NIO 呢? NIO…

第06章 数据加载、存储与文件格式

以下内容参考自https://github.com/iamseancheney/python_for_data_analysis_2nd_chinese_version/blob/master/%E7%AC%AC05%E7%AB%A0%20pandas%E5%85%A5%E9%97%A8.md 《利用Python进行数据分析第2版》 用以学习和记录。 输入输出通常可以划分为几个大类:读取文本文…

深海奥秘:鳐鱼肽的肌肤之旅

深海,一个神秘又充满生命力的世界,总是带给我们无尽的惊喜。鳐鱼,又被称为“魔鬼鱼”,它的皮肤中含有一种特殊的肽,这种肽不仅分子量适中,易于人体吸收,还具有极高的消化率和生物利用度。来自北…

科技引领乡村振兴新潮流:运用现代信息技术手段,提升农业生产和乡村管理效率,打造智慧化、现代化的美丽乡村

一、引言 随着科技的不断进步,现代信息技术已经渗透到社会的各个领域,成为推动社会发展的重要力量。在乡村振兴战略的背景下,科技的力量同样不容忽视。本文旨在探讨如何运用现代信息技术手段,提升农业生产和乡村管理效率&#xf…

Android软件渲染流程

Android软件渲染流程 一.渲染流程1.VSync信号的监听2.VSync信号触发绘制 二.渲染原理1.画布的获取1.1 渲染缓存的初始化1.2 graphics::Canvas的创建1.3 graphics::Canvas与渲染缓存的绑定1.3.1 SkBitmap的初始化1.3.2 SkiaCanvas与SkBitmap的绑定1.3.3 SkCanvas的创建 2.矩形的…

Transformer系列专题(二)——multi-headed多头注意力机制

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、什么是multi-headed(多头注意力机制)二、multi-headed三、multi-headed结果四、堆叠多层总结 前言 在实践中,当给定相同…

【数据库基础】基本认识数据库--入门引导

文章目录 什么是数据库?主流数据库基本使用安装MySQL连接服务器服务器、数据库、表关系使用案例数据逻辑存储 MySQL架构SQL语句分类什么叫存储引擎 什么是数据库? 数据库是指在磁盘和内存中存储特定结构组织的数据。数据库通常用于存储于某个系统、组织或…

分布式异步框架celery + Redis 安装配置

引入 这里不对web框架做过多说明,到时候在总结一篇 python的常见web框架 django、flask、tornado、sanic、fastapi..各框架区别 - 内部集成功能的多少 django,内部提供了很多组件。 【相对大】flask、tornado、sanic、fastapi… 本身自己功能很少第…

Linux c开发线程锁和条件变量使用

#include <pthread.h> #include <stdio.h> #include <unistd.h>pthread_mutex_t mutex PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond PTHREAD_COND_INITIALIZER;void* thread_function(void* arg) {printf("线程等待唤醒,锁定互斥量...\n");…

【Unitydemo制作】音游制作—排行榜逻辑Json存储

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;就业…

查看当前Shell系统环境变量

查看当前Shell系统环境变量 查看命令 env效果 查看Shell变量(系统环境变量自定义变量函数) 命令 set效果 常用系统环境变量 变量名称含义PATH与windows环境变量PATH功能一样&#xff0c;设置命令的搜索路径&#xff0c;以冒号为分割HOME当前用户主目录&#xff1a;/rootSH…

day08-Java常用API

day08——Java常用API 一、今日内容介绍、API概述 各位同学&#xff0c;我们前面已经学习了面向对象编程&#xff0c;使用面向编程这个套路&#xff0c;我们需要自己写类&#xff0c;然后创建对象来解决问题。但是在以后的实际开发中&#xff0c;更多的时候&#xff0c;我们是…