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

目录

[1. 数据库索引](#1. 数据库索引)

[1.1 索引的概念](#1.1 索引的概念)

[1.2 索引的特点](#1.2 索引的特点)

[1.3 索引查询对比普通的查询](#1.3 索引查询对比普通的查询)

[1.4 索引的操作](#1.4 索引的操作)

[1.5 索引的原理](#1.5 索引的原理)

[1.6 B树](#1.6 B树)

[1.7 B+树](#1.7 B+树)

[1.8 B+树的优点](#1.8 B+树的优点)


1. 数据库索引

1.1 索引的概念

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

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


1.2 索引的特点

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

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

普通select查询

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

索引查询

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

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


1.4 索引的操作

(1)查看索引

sql 复制代码
show index from 表名;

(2)创建索引

sql 复制代码
create index 索引名 on 表名(字段名);

(3)删除索引

sql 复制代码
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访问次数
  • 由于叶子节点之间的链表结构,方便增加和删除操作
  • 所有叶子节点之间属于有序链表,方便范围查询。
  • 由于叶子节点存放数据,查询开销非常的稳定(稳定性好)
相关推荐
易番番ERP5 分钟前
品牌代理商SKU繁多,ERP如何高效处理新旧规格替换?
数据库·微服务·云原生·sku·易番番erp
leo_yu_yty15 分钟前
Mysql 面试准备
数据库·mysql·面试
SelectDB30 分钟前
拉卡拉统一金融 OLAP:基于 Apache Doris / SelectDB 实现查询提速 15 倍、资源直降 52%
数据库
SelectDB40 分钟前
四川航空湖仓一体:基于 SelectDB / Apache Doris 的多源数据联邦分析实践
数据库
SelectDB1 小时前
网易云音乐日志平台:基于 Apache Doris / SelectDB 替换 ClickHouse 承载日增万亿日志
数据库
herinspace2 小时前
管家婆财贸ERP如何进行基本信息批量搬移
服务器·数据库·管家婆软件·财务软件
小马9262 小时前
智能体时代的两块基石:DeepSeek Harness 开源与“认知基础设施“数据库
数据库·人工智能·开源·agent
那年窗外下的雪.2 小时前
VXLAN EVPN 分层排障:从 VTEP 可达、ARP/MAC 到 MAC Mobility
服务器·前端·网络·数据库·spine
冰暮流星2 小时前
mysql练习1
数据库·mysql
三8443 小时前
MySQL 文件读写函数详解:从 CTF 实战到 LOAD_FILE、INTO OUTFILE、LOAD DATA INFILE 应用
数据库·sql