【MySQL数据库】| 索引以及背后的数据结构
🎗️ 主页:小夜时雨
🎗️ 专栏:MySQL数据库
🎗️ 如何优雅的活着,是我找寻的方向
目录
- 1. 基本知识
- 2. 索引背后的数据结构
- 总结
1. 基本知识
- 概念
索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中一列或者多列创建索引,并指定索引的类型,各类的索引有各自的数据结构来实现。
索引存在的意义就是就是为了加快查询速度!!!(因为实际开发中,查询场景用的多)。
但是也付出了一定的代价:
- 需要付出额外的空间来保存索引的数据。
- 索引可能会拖慢新增,删除和修改的速度。
- 作用
- 数据库中的表,数据,索引之间的关系,类似于书架上的图书,书籍内容和目录的关系。
- 索引所起的作用类似于数据目录,可以快速定位,检索数据。
- 索引对于提高数据库的性能有很大的帮助。
- 使用场景
要考虑对数据库表的某列或者几列创建索引,需要考虑以下几点:
- 数据量较大,且经常要对这些列进行条件查询
- 插入和修改操作较少
- 索引会占用额外的磁盘空间
那么也就引申出什么时候不要用索引?
- 经常增删改的列不要建立索引
- 有大量重复的列不建立索引
2. 索引背后的数据结构
索引背后使用的是 B+ 树。
1. 为什么不使用 二叉搜索树或者哈希表来存储索引数据?
-
对于二叉搜索树:二叉搜索树的特点是,每个非叶子节点都有两个孩子节点,
如果元素的个数多了,那么树的高度就会很高,自根节点向下搜索需要访问的叶子结点也会非常多,这就大大降低了查询的效率。树的高度相当于是比较次数,对于数据库来说就是 IO 的访问次数。 -
对于哈希表: 虽然查询的快,但是哈希表是 key-value 结构的,需要知道 key 是多少,通过哈希函数来计算到下标,进而查找到数据,但是模糊查询的时候,key 值无法确定,也就查询不到数据了,即是不支持范围查询和模糊查询。
2. 索引结构为什么不使用 B 树(或者B- 树) ?
B 树可以认为是一个N叉搜索树 ,结构如下:
B 树的特点:
每个节点都可以存储多个数据,这些多个数据就划分出了一定的区间,在搜索的时候就不用访问那么多的叶子节点,而是直接在细分的区间去查找,提高了效率。
MySQL索引结构–B+ 树
结构如下:
B+树的特点:
- 一个节点可以存储 N 个key,N 个key又划分出 N 个区间 (不是 N+1 个区间,看图可知)
- 整个树的数据都是在 叶子节点上的,所有非叶子节点上的数据都会在叶子节点中出现(同时也是叶子结点的最大值)。也就是每个节点中的 key 值,都会在子结点中出现,同时该key也是子节点的最大值。
- B+ 树的叶子节点是首尾相连的,类似于链表结构的。
- 由于叶子节点保存完整的数据,只在叶子节点这里存储每一行的数据,而非叶子节点只保存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内置的函数式接…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...