【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.pswp.cn/news/917524.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/917524.shtml

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

相关文章

jQuery Mobile 面板详解

jQuery Mobile 面板详解 引言 随着移动设备的普及,移动网页开发变得越来越重要。jQuery Mobile 是一个基于 jQuery 的移动网页开发框架,它提供了一套丰富的 UI 组件和主题,使得开发者可以快速构建出美观、响应式的移动网页。在 jQuery Mobile 中,面板(Panel)是一个非常…

Python中的import和from...import有什么区别?

文章目录 前言 一、import导入模块 导入模块并给它一个别名 语法格式 二、from...import导入特定项 1.导入模块中的特定项 2.导入模块中的所有项 2.1 命名空间核污染 2.2 性能影响 总结 前言 在Python编程中,模块和包的导入机制是编写可维护、可扩展代码的核心。深入理解Pyth…

vscode提示“无法使用 compilerPath 解析配置”解决办法

0 问题描述 使用vscode的Remote-SSH插件连接安装在虚拟机上的Windows10进行远程开发时,出现如下提示:无法使用 compilerPath 解析配置:“D:\mingw64\bin\gcc.exe” 所有包含C库头文件的文件都被标红提示错误:1 问题原因 vscode没有设置正确的…

信噪比(Signal-to-Noise Ratio, SNR)详细介绍

信噪比(Signal-to-Noise Ratio, SNR)信噪比(Signal-to-Noise Ratio,SNR)是衡量信号质量的重要参数,表示有用信号的功率与背景噪声功率的比值。SNR在通信、音频处理、视频处理以及其他电子信号处理领域中具有…

Nginx 相关实验(1)

nginx源码编译 本实验采用nginx源码编译的安装方式,需要准备一个tar包,可从nginx官网上下载。 下载地址:nginx: downloadhttps://nginx.org/en/download.html 将下载好的压缩包传到虚拟机中的自定义目录下 [rootwebserver ~]# ls anacond…

【选型】HK32L088 与 STM32F0/L0 系列 MCU 参数对比与选型建议(ST 原厂 vs 国产芯片)(单片机选型主要考虑的参数与因素)

国产 vs ST 单片机在工业控制中的性能对比分析 HK32L088 与 STM32F0/L0 系列 MCU 参数对比与选型建议 工业控制领域 MCU 选型:国产航顺 HK32 与 ST 原厂芯片深入比较 国产 MCU 是否可替代 ST?基于发电机控制应用的深入评估 从数据手册看 MCU 制造工艺差异:HK32L088 vs S…

LLM Prompt与开源模型资源(1)提示词工程介绍

学习材料:https://www.hiascend.com/developer/courses/detail/1935520434893606913学习时长: 预计 30 分钟学习目的: 了解提示工程的定义与作用 熟悉提示工程的关键技术相关概念 掌握基于昇腾适配的大模型提示工程的入门及进阶指南 提示…

kafka与其他消息队列(如 RabbitMQ, ActiveMQ)相比,有什么优缺点?

Kafka、RabbitMQ 和 ActiveMQ 是三种最主流的消息中间件,它们的设计和适用场景有所不同。 我们可以通过一个简单的表格来快速了解它们的核心区别: 核心对比一览特性 / 维度KafkaRabbitMQActiveMQ核心模型分布式、持久化的日志系统 (Dumb Broker / Smart …

Kubernetes架构和部署

k8s组件 master节点:管理节点 管理平面组件 api server : api gateway controller manager scheduler etcd 数据库 worker节点:被管理节点,运行容器 kubelet:k8s agent container runtime:docker,containerd,cri-o kube-proxy:service 网络 कुबेरनेट…

建造者模式及优化

建造者模式是一种创建型设计模式,它将复杂对象的构建过程与表示分离,使得同样的构建过程可以创建不同的表示。核心思想是指挥者定流程,建造者填细节,通过多个步骤逐步构建对象,并允许灵活组合这些步骤以生成不同配置的…

【09】C++实战篇——C++ 生成静态库.lib 及 C++调用lib,及实际项目中的使用技巧

文章目录1 C 静态库.lib 生成1.1 静态库lib的生成方法和使用方法1.2 创建静态库项目1.3 编写.h 和 .cpp文件1.4 设置 及 生成 DLL2 调用 C 静态库lib2.1 新建LIBtest及测试代码2.2 静态库配置 及代码调用测试3 实际项目中的使用技巧、及通用设置3.1 设置lib输出路径3.2 设置头文…

飞算JavaAI:从写不出代码到丝滑开发,飞算JavaAI把小白从编程深渊捞进了正轨---它都让我怀疑自己是不是多余的!

开篇介绍 对于很多初学者来说,编程是一项既有趣又充满挑战的任务。面对复杂的代码和繁琐的开发流程,常常会感到无从下手。不过,现在有了飞算JavaAI,这一切都将变得简单起来。 它有啥实用功能呢? 比如: …

关于tresos Studio(EB)的MCAL配置之GtmCfg

Generic Time Module通用时钟模块GeneralGtmCfg_DevErrorDetect开发者错误检测开关GtmCfg_DemErrorReporting诊断错误报告开关GtmCfg_VersionInfoApi获取版本信息的接口开关GtmCfg_ConfigSetClockManagementUnitGlobal_Clock_Control_Numerator全局时钟分频器的分子Global_Cloc…

深入探索Weaviate:构建高效AI应用的数据库解决方案

在当今数据驱动的世界中,高效地存储、检索和处理大规模数据成为了AI应用开发的关键挑战。Weaviate作为一个开源的向量搜索引擎,凭借其强大的功能和灵活的架构,正逐渐成为开发者构建智能AI应用的首选工具。本文将深入探讨Weaviate的核心概念、…

【开源】一款开源、跨平台的.NET WPF 通用权限开发框架 (ABP) ,功能全面、界面美观

文章目录一、开源地址二、框架介绍三、技术路线四、适用场景五、功能模块六、框架演示截图一、开源地址 Gihub地址: https://github.com/HenJigg/wpf-abp B站学习视频:https://www.bilibili.com/video/BV1nY411a7T8?spm_id_from333.788.player.switch&…

信创缓存中间件-TongRDS(Redis平替)安装

TongRDS 是由东方通开发的国产 分布式内存数据缓存中间件,功能类似于 Redis,但它是完全自主研发的国产产品,是国内信创的一大重要组件。它兼容 Redis 的接口,能做到应用代码无需改动即可替换使用。TongRDS是没有直接的下载地址的。…

Git链接备用手册

三板斧及其他:git init:初始化git仓库git add . :将所在文件夹中的所有文件加入到暂存区git commit -m 自定义记录信息 :将暂存区中的数据放到Git的仓库(本地)中,并进行记录(自定义&#xff0…

零信任网络概念及在网络安全中的应用

零信任网络概念及在网络安全中的应用 零信任网络(Zero Trust Network)是一种颠覆传统边界安全的架构理念,其核心是**“永不信任,始终验证”**(Never Trust, Always Verify)。它假设网络内外均存在威胁&…

GaussDB case when的用法

1 case函数的类型case具有两种格式&#xff0c;简单case函数和case搜索函数。这两种方式&#xff0c;大部分情况下可以实现相同的功能。1.1 简单case函数语法case column when <condition> then value when <condition> then value ...... else value end;示例case…

Git用法记录

代码中冲突标记的含义&#xff1a;<<<<<<< HEAD 标记当前分支&#xff08;或本地&#xff09;的旧代码作为分隔线 >>>>>>> [commit哈希] 标记从其他分支合并过来的新代码&#xff08;这里的 c472b4b... 是提交哈希&#xff09; 暂存…