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

【MySQL数据库】| 索引以及背后的数据结构

🎗️ 主页:小夜时雨
🎗️ 专栏:MySQL数据库
🎗️ 如何优雅的活着,是我找寻的方向
优雅

目录

    • 1. 基本知识
    • 2. 索引背后的数据结构
      • 总结

1. 基本知识

  1. 概念

索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中一列或者多列创建索引,并指定索引的类型,各类的索引有各自的数据结构来实现。

索引存在的意义就是就是为了加快查询速度!!!(因为实际开发中,查询场景用的多)。
但是也付出了一定的代价:

  1. 需要付出额外的空间来保存索引的数据。
  2. 索引可能会拖慢新增,删除和修改的速度。
  1. 作用
  • 数据库中的表,数据,索引之间的关系,类似于书架上的图书,书籍内容和目录的关系。
  • 索引所起的作用类似于数据目录,可以快速定位,检索数据。
  • 索引对于提高数据库的性能有很大的帮助。
  1. 使用场景

要考虑对数据库表的某列或者几列创建索引,需要考虑以下几点:

  • 数据量较大,且经常要对这些列进行条件查询
  • 插入和修改操作较少
  • 索引会占用额外的磁盘空间

那么也就引申出什么时候不要用索引?

  1. 经常增删改的列不要建立索引
  2. 有大量重复的列不建立索引

2. 索引背后的数据结构

索引背后使用的是 B+ 树。

1. 为什么不使用 二叉搜索树或者哈希表来存储索引数据?

  • 对于二叉搜索树:二叉搜索树的特点是,每个非叶子节点都有两个孩子节点,
    如果元素的个数多了,那么树的高度就会很高,自根节点向下搜索需要访问的叶子结点也会非常多,这就大大降低了查询的效率。树的高度相当于是比较次数,对于数据库来说就是 IO 的访问次数。

  • 对于哈希表: 虽然查询的快,但是哈希表是 key-value 结构的,需要知道 key 是多少,通过哈希函数来计算到下标,进而查找到数据,但是模糊查询的时候,key 值无法确定,也就查询不到数据了,即是不支持范围查询和模糊查询。

2. 索引结构为什么不使用 B 树(或者B- 树) ?

B 树可以认为是一个N叉搜索树 ,结构如下:
在这里插入图片描述

B 树的特点:

每个节点都可以存储多个数据,这些多个数据就划分出了一定的区间,在搜索的时候就不用访问那么多的叶子节点,而是直接在细分的区间去查找,提高了效率。

MySQL索引结构–B+ 树

结构如下:
在这里插入图片描述
B+树的特点:

  1. 一个节点可以存储 N 个key,N 个key又划分出 N 个区间 (不是 N+1 个区间,看图可知)
  2. 整个树的数据都是在 叶子节点上的,所有非叶子节点上的数据都会在叶子节点中出现(同时也是叶子结点的最大值)。也就是每个节点中的 key 值,都会在子结点中出现,同时该key也是子节点的最大值。
  3. B+ 树的叶子节点是首尾相连的,类似于链表结构的。
  4. 由于叶子节点保存完整的数据,只在叶子节点这里存储每一行的数据,而非叶子节点只保存key值即可

B+ 树的优势:

  • 一个节点中保存更多的key值,所以最终树的高度是相对矮的,也就是查询的时候减少了 IO 的访问次数。(这里 IO 特值硬盘的访问)
  • 所有的查询都会落在叶子节点,也就是查询任何一个数据,访问 IO 的次数是一样的,也就意味着查询更加稳定(稳定可以对执行效率有一个判断)。
  • B+ 树的叶子节点类似于链表结构,方便进行范围查询。
  • 由于所有数据都是在叶子节点上,非叶子节点只存储key值,所以非叶子节点占用的空间是比较小的,这些叶子节点可能就是在内存中缓存,有进一步减少了 IO 的访问次数。

总结

  • B+树对于哈希表来说,可以处理模糊匹配的场景;
  • B+树对于二叉搜索树来说,深度更低,查找效率更高;
  • B+树对于B树来说,
    • B树只适合随机检索,而B+树同时支持随机检索和顺序检索;
    • 单一节点可以储存更多的数据,降低查询的IO次数;
    • 所有的查询都需要查找到叶子结点,使得查询性能更稳定;
    • 兄弟节点之间相连形成有序链表,便于范围内查找,增删效率也更高;

🎗️🎗️🎗️ 好啦,到这里有关 数据库索引 的分享就没了,如果感觉做的还不错的话可以点个赞,关注一下,你的支持就是我继续下去的动力,蟹蟹大家了,我们下期再见,拜了个拜~ ☆*: .。. o(≧▽≦)o .。.:*☆

相关文章:

【MySQL数据库】| 索引以及背后的数据结构

🎗️ 主页:小夜时雨 🎗️ 专栏:MySQL数据库 🎗️ 如何优雅的活着,是我找寻的方向 目录 1. 基本知识2. 索引背后的数据结构总结 1. 基本知识 概念 索引是一种特殊的文件,包含着对数据表里所有…...

家用电脑做服务器,本地服务器搭建,公网IP申请,路由器改桥接模式,拨号上网

先浇一盆冷水! 我不知道其他运营商是什么情况。联通的运营商公网IP端口 80、8080、443 都会被屏蔽掉,想要开放必须企业备案(个人不行)才可以。也就是说,只能通过其他端口进行showtime了。 需要哪些东西? 申…...

原神游戏干货分享:探索璃月的宝箱秘密,提高游戏资源获取效率!

《原神》是一款备受玩家喜爱的开放世界冒险游戏,而在游戏中获取资源是提升角色实力的重要途径。在这篇实用干货分享中,我们将介绍一些探索璃月地区的宝箱秘密,帮助你提高游戏资源获取的效率。 首先,璃月地区的宝箱分为普通宝箱和精…...

idea 2023 设置启动参数、单元测试启动参数

找到上方的editconfigration, 如下图,如果想在启动类上加,就选择springboot,如果想在单元测试加,就选择junit 在参数栏设置参数,多个参数以空格隔开 如果没有这一栏,就选择就可以了。 然后&…...

RSA加密算法(后端)

public class RSA {private static final String RSA_ALGORITHM "RSA";/*** 生成RSA密钥对** return RSA密钥对*/public static KeyPair generateKeyPair() throws NoSuchAlgorithmException {KeyPairGenerator keyPairGenerator KeyPairGenerator.getInstance(RSA…...

挑战100天 AI In LeetCode Day08(热题+面试经典150题)

挑战100天 AI In LeetCode Day08(热题面试经典150题) 一、LeetCode介绍二、LeetCode 热题 HOT 100-102.1 题目2.2 题解 三、面试经典 150 题-103.1 题目3.2 题解 一、LeetCode介绍 LeetCode是一个在线编程网站,提供各种算法和数据结构的题目&…...

地铁机电设备健康管理现状及改善方法

轨道交通和我们的生活息息相关,从火车到地铁再到轻轨,给人们的出行带来了很大的便利。因此,保障轨道交通的的正常运行和安全至关重要,需要运维人员及时排查设备的问题,解决故障,保证轨道交通的安全运行。本…...

安卓NDK开发

1、jni:java native interface 作用:用于java代码和C、c代码的交互(代码混编); 分类使用:Jni静态注册、jni动态注册 2、静态注册 1).绑定java方法和C/C方法的方式之一; …...

高性能网络编程 - 解读5种I/O模型

文章目录 服务端处理网络请求流程图基础概念阻塞调用 vs 非阻塞调用同步处理 vs 异步处理阻塞、非阻塞 和 同步、异步的区别recvfrom 函数 五种I/O模型I/O模型1:阻塞式 I/O 模型(blocking I/O)I/O模型2:非阻塞式 I/O 模型(non-blocking I/O&a…...

复盘一个诡异的Bug

该Bug的诡异之处在于这是一个由多种因素综合碰撞之后形成的综合体。纵观整个排查过程,一度被错误的目标误导,花费大量功夫后才找到问题点所在,成熟的组件在没有确凿证据之前不能随意怀疑其稳定性。 前言 此前在接入两台粒径谱仪(…...

【uniapp】通用列表封装组件

uniapp页面一般都会有像以下的列表页面,封装通用组件,提高开发效率; (基于uView前端框架) 首先,通过设计图来分析一下页面展示和数据结构定义 w-table组件参数说明 参数说明类型可选值默认值toggle列表是…...

17 Linux 中断

一、Linux 中断简介 1. Linux 中断 API 函数 ① 中断号 每个中断都有一个中断号,通过中断号可以区分出不同的中断。在 Linux 内核中使用一个 int 变量表示中断号。 ② request_irq 函数 在 Linux 中想要使用某个中断是需要申请的,request_irq 函数就是…...

微信小程序真机调试连接状态一直在正常和未链接之间反复横跳?

背景:小程序真机调试的时候,发现真机的network不显示接口调用情况,控制台也没有输出内容。具体如下所示; 解决方法: 1、确保手机端连接的网络和微信开发者工具网络一致,比如用同一个WiFi 2、真机自动调试…...

最新Next 14快速上手基础部分

最新Next 14快速上手基础部分 最新的NEXT快速上手文档,2023.10.27 英文官网同步,版本Next14.0.0 本项目案例:GitHub地址,可以根据git回滚代码到对应知识,若有错误,欢迎指正! 一、介绍 1.什么是…...

【uniapp/uview】Collapse 折叠面板更改右侧小箭头图标

最终效果是这样的: 官方没有给出相关配置项,后来发现小箭头不是 uview 的图标,而是 unicode 编码,具体代码: // 箭头图标 ::v-deep .uicon-arrow-down[data-v-6e20bb40]:before {content: \1f783; }附一个查询其他 u…...

企业如何落地搭建商业智能BI系统

随着新一代信息化、数字化技术的应用,引发了新一轮的科技革命,现代化社会和数字化的联系越来越紧密,数据也变成继土地、劳动力、资本、技术之后的第五大生产要素,这一切都表明世界已经找准未来方向,前沿科技也与落地并…...

RedisTemplate连接密码设置教程

最近在一个项目中使用Redis保存Token时,出现连接Redis报错的情况 org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to localhos…...

基于SSM的二手车交易网站的设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…...

温故知新:探究Android UI 绘制刷新流程

一、说明: 基于之前的了解知道ui的绘制最终会走到Android的ViewRootImpl中scheduleTraversals进行发送接收vsync信号绘制,在ViewRootImpl中还会进行主线程检测,也就是我们所谓子线程更新ui会抛出异常。 像我们常用的刷新ui,inval…...

设计模式-命令模式(Command)

设计模式-命令模式(Command) 一、命令模式概述1.1 什么是命令模式1.2 简单实现命令模式1.3 使用命令模式的注意事项 二、命令模式的用途三、命令模式实现方式3.1 使用匿名内部类实现命令模式3.2 使用Lambda表达式实现命令模式3.3 使用Java内置的函数式接…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...