当前位置: 首页 > news >正文

【MySQL】MySQL索引—B树/B+树

目录

1. 数据库索引

1.1 索引的概念

1.2 索引的特点

1.3 索引查询对比普通的查询

1.4 索引的操作

 1.5 索引的原理

 1.6 B树

1.7 B+树 

1.8 B+树的优点


1. 数据库索引

1.1 索引的概念

数据库的索引是一种特殊的数据结构,里面包含着数据表中所有记录的引用,可以对表中一列或者多列创建索引并指定类型

可以将数据库的索引想象为书的目录,可以帮助数据库系统快速定位和访问表中的特定数据,而不必扫描整个表。


1.2 索引的特点

  • 通过索引可以直接定位数据,不需要逐个扫描数据表中的记录,可以提高数据库的查询性能
  • 数据表在进行插入/更新/删除操作时,因为要更新索引,导致效率降低
  • 由于索引需要单独存储,需要引入额外的存储开销
  • 一般建议高频的查询建立索引(如:根据用户名—密码)
  • 在实际的工作中,查询使用的频率远远高于数据的增加/删除/修改

1.3 索引查询对比普通的查询

普通select查询

  1. 需要遍历整个表
  2. 将遍历的当前行带入条件中,看条件是否成立
  3. 如果条件成立,则将这一行保留,不成立则会跳过

索引查询

  1. 不需要遍历整个表
  2. 只需要读取索引页和少量的数据页
  3. 并通过索引数据结构(B+树)快速定位数据

 索引属于针对查询操作进行的优化手段,可以通过索引来加快查询的速度,由于数据存储在硬盘中,如果每次插叙都访问硬盘,数据从硬盘中加载进入内存,进行对比,这一系列操作开销虽然不大,但是数据量如果非常多的话,则会导致开销很大,所以引入索引是很有必要的


1.4 索引的操作

(1)查看索引

show index from 表名;

(2)创建索引

create index 索引名 on 表名(字段名);

(3)删除索引

drop index 索引名 on 表名;

注意:

  • 一个索引是针对一个列来指定的,只有这一列进行查询的时候,查询速度才会被优化
  • 一个表中可以存在多个索引
  • 创建索引一般在创建表的时候就需要规定好索引
  • 如果现有的数据很多,整个时候如果增加一个索引,很有可能会造成数据库的崩溃

 1.5 索引的原理

  • 索引的实现肯定是依靠数据结构,但是我们平常使用的数据结构,并不适合
  • 顺序表:适合通过下表访问和尾插
  • 链表:适合中间插入和删除,不适合查询
  • 栈/队列/堆:这些更不适合
  • 二叉搜索树: 由于平衡性问题,查询效率会降低(不稳定),硬盘数据的存储效率低,查询效率低
  • 哈希表:只适合点到点的精准查询,不能进行范围查询和模糊查询
  • 红黑树:虽然可以精准查询和模糊查询,但是由于树的高度较高,查询访问的IO访问次数会变多

由于常见的这些数据结构,都不适合数据库操作,故引入了新的数据结构—B+树(N叉搜索树)

 1.6 B树


在了解B+树之前,先了解B树

类似于这样的结构,就是B树

  • 节点内部Key按顺序排列,自动保持树的高度平衡,所有叶子节点位于同一层,每个节点可以有多个子节点
  • 每一个节点可以存在多个Key ,但是也不是无限存储,到达一定的规模会触发节点的分裂,删除元素到达一定的数据也会触发合并
  • 一个节点上保存N个key值就可以划分出N+1个区间,每个区间都可以衍生出一系列的子树
  • 像这些节点,都存储在硬盘的一块区域中,一次读取节点,意味着读取出多个Key,再进行几次比较,就可以快速找到自己想要的数值

1.7 B+树 

  • 所有的数据都保存在叶子节点中,除叶子结点外的节点,不保存数据,只是用来索引
  • 节点中,最右边为最大值(根节点中,最右边为整个元素中的最大值)
  • 无论增加或删除什么元素,都需要保证根节点的最右边是最大元素
  • 每一个父节点元素都出现在子节点中,是子节点最大(或最小)元素。

 在进行查询的时候,从根节点触发,判定要查询的数据,在节点的那个区间,决定往哪里走,叶子节点之间,通过双链表进行连接,方便数据集合之间按照范围进行查询,也可以快速进行删除和增加等操作


1.8 B+树的优点

相比于B树,红黑树来说

  • N叉搜索树,树的高度有限,降低了IO访问次数
  • 由于叶子节点之间的链表结构,方便增加和删除操作
  • 所有叶子节点之间属于有序链表,方便范围查询。
  • 由于叶子节点存放数据,查询开销非常的稳定(稳定性好)

http://www.lryc.cn/news/604651.html

相关文章:

  • 基于 Hadoop 生态圈的数据仓库实践 —— OLAP 与数据可视化(五)
  • wps批量让浮动在表格的图片跟随单元格移动和调整大小
  • 如何在生成式引擎优化(GEO)中取得成功
  • MySQL 9 Group Replication维护
  • 疯狂星期四文案网第24天运营日记
  • 力扣 hot100 Day60
  • Day 26 函数专题1:函数定义与参数
  • 少林寺用什么数据库?
  • pycharm的一些小细节
  • Linux:haproxy
  • jmeter实战案例
  • JavaWeb 进阶:Vue.js 与 Spring Boot 全栈开发实战(Java 开发者视角)
  • 基于React+Express的前后端分离的个人相册管理系统
  • 使用Docker 在Rocky Linux 9.5上在线安装Dify
  • 八股文场景题
  • 从一开始的网络攻防(十四):WAF绕过
  • KONG API Gateway中的核心概念
  • 聊聊如何判断发现的缺陷属于前后端
  • 【Dolphinscheduler】docker搭建dolphinscheduler集群并与安全的CDH集成
  • winsock socket通讯为什么UDP服务器无法获取客户端IP?
  • UDP通讯和TCP通讯的区别-UDP(用户数据报协议)和 TCP(传输控制协议)
  • BeeWorks Meet:私有化部署,重塑高安全需求行业的视频会议体验
  • 云计算:一场关于“数字水电煤”的革命与未来
  • LoongCollector 安全日志接入实践:企业级防火墙场景的日志标准化采集
  • java~单例设计模式
  • react19更新哪些东西
  • 如何通过IT-Tools与CPolar构建无缝开发通道?
  • 第十七章 追新词
  • 7.Linux :进程管理,进程控制与计划任务
  • LLM—— 基于 MCP 协议(Streamable HTTP 模式)的工具调用实践