揭秘!MySQL索引背后的秘密武器:B+树为何力压跳表,独领风骚?

news2024/12/23 9:08:40

在这里插入图片描述

引出

想象一下,你正在一家巨大的图书馆工作,这里藏书百万册,读者络绎不绝,每个人都想尽快找到他们想要的书籍。图书馆的布局有两种设计方案摆在你面前:

方案A:使用传统的目录卡片系统,就像老式的图书馆一样,每本书的信息都写在一张卡片上,按照字母顺序排列在一个巨大的抽屉柜里。这听起来就像是线性的数据存储,查找一本书的性能是O(n)——如果我们要找的是最后一本书,可能要翻阅整个抽屉!

方案B:使用现代的计算机系统,它采用B+树结构来索引所有的书籍。这意味着无论你要找哪一本书,计算机都能迅速定位,就像有了GPS导航一样,查找性能提升到了O(log N)。

那么,如果有人建议我们用跳表来代替B+树呢?跳表就像是在图书馆的每排书架上方都挂了一个指示牌,每个指示牌又指向下一个指示牌,这样找书时就可以跳跃式前进,减少行走的距离,性能同样是O(log N),并且实现也很简单,那为什么Mysql的索引不使用跳表呢?用跳表做索引的Mysql又有什么不一样呢?

在这里插入图片描述
在这里插入图片描述

MySQL的B+树索引:

MySQL主要面向磁盘存储,其中的InnoDB存储引擎使用B+树作为索引结构。B+树具有以下特点:

  1. 所有的叶子节点都存储实际的数据,非叶子节点只存储索引信息。
  2. 高度相对较低,能够有效地减少磁盘I/O次数,这是因为磁盘的访问速度远慢于内存。
  3. B+树的节点通常较大,可以容纳更多的键值对,这同样减少了磁盘I/O的次数。
  4. 节点大小通常与页大小对齐,以优化磁盘读写。
    在这里插入图片描述

Redis的跳表索引:

Redis是一个内存数据库,其设计目标是提供高速的数据存取能力。跳表(Skiplist)作为索引结构,有以下优势:

  1. 实现简单,易于理解和维护。
  2. 平均情况下,跳表提供了O(log N)的查找性能,这与平衡树相似。
  3. 跳表在内存中运行,不需要考虑磁盘I/O的开销。
  4. 跳表的随机性允许它在插入和删除操作时保持良好的性能,避免了如平衡树那样的频繁旋转操作。

MySQL如果使用跳表:

如果MySQL使用跳表,那么它的性能特征会有所不同。MySQL是为大规模数据存储和复杂事务设计的。它处理的数据量可能达到TB甚至PB级别,这些数据主要存储在磁盘上,由于跳表主要针对内存优化,MySQL可能无法充分利用跳表的优势,反而会因为频繁的磁盘I/O而降低性能。此外,跳表的多级索引需要额外的内存空间,这在磁盘存储环境中可能会导致更大的存储开销。

当然了,Mysql不同存储引擎索引也有用跳表来实现的,比如:RocksDB
他的写入性能确实要比InnoDB要好,但读性能确实要比InnoDB差了不少。
在这里插入图片描述
在这里插入图片描述

思考:为什么Redis使用跳表而不使用B+树或二叉树呢?

Redis选用跳表作为有序集合(ZSET)的底层数据结构,主要是考虑到其内存数据库的特性。跳表提供类似B+树的O(log N)时间复杂度,但实现更简单,维护成本低,尤其适合内存环境,无需顾虑磁盘I/O优化。尽管跳表在极端情况下的空间效率略逊,Redis的内存管理能消化这一劣势。跳表的随机性和动态层级调整机制使其在处理动态数据集时表现优异,无需复杂的平衡操作。加之Redis的单线程设计,跳表避免了并发控制的复杂性,确保了稳定高效的性能。总之,跳表的特性完美契合了Redis对高性能、易实现和低维护需求的追求,在内存中展现出了独特优势。

小结

简而言之,如果MySQL使用跳表做索引,理论上可以实现O(log N)的查询性能,但实际的磁盘I/O效率和并发控制能力可能会大打折扣。因此,MySQL选择了B+树,它就像一个专门为大型图书馆定制的超级导航系统,让海量数据的查找和维护变得既快速又稳定。

所以,下次当有人问起为什么MySQL不用跳表做索引时,你可以告诉他们:“那是因为MySQL的‘图书馆’太大太忙了,需要一个更专业的导航员——B+树!”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1923695.html

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

相关文章

循环结构(一)——for语句【互三互三】

文章目录 🍁 引言 🍁 一、语句格式 🍁 二、语句执行过程 🍁 三、语句格式举例 🍁四、例题 👉【例1】 🚀示例代码: 👉【例2】 【方法1】 🚀示例代码: 【方法2】…

无人机运营合格证及无人机服务资质认证详解

一、运营合格证 无人机运营合格证是无人机运营单位或个人在特定区域内从事无人机运营活动的法定凭证。该证书由相关部门根据无人机运营单位的资质、技术能力和管理水平等综合因素进行审批和颁发。获得运营合格证的单位或个人需严格遵守国家相关法规和规定,确保无人…

3-2 多层感知机的从零开始实现

import torch from torch import nn from d2l import torch as d2lbatch_size 256 # 批量大小为256 train_iter, test_iter d2l.load_data_fashion_mnist(batch_size) # load进来训练集和测试集初始化模型参数 回想一下,Fashion-MNIST中的每个图像由 28 28 784…

【考研408操作系统】最容易理解的知识体系-文件管理-面向计算机管理

苏泽 “弃工从研”的路上很孤独,于是我记下了些许笔记相伴,希望能够帮助到大家 本篇内容续写上一篇的【考研408&操作系统】最容易理解的知识体系-文件管理-面向人类管理 这一篇将站在计算机如何管理好文件的角度去梳理这一章节的知识点 目录 本…

.欧拉函数.

先介绍欧拉函数: 贴一张 证明: 这里利用容斥原理来进行证明:若要求1~N当中与N互质的个数,则应在1~N当中去除N的质因数的倍数,因为既然是因数,那么一定不与N互质,既然是N的因数,那么…

初识Laravel(Laravel的项目搭建)

初识Laravel(Laravel的项目搭建) 一、项目简单搭建(laravel)1.首先我们确保使用国内的 Composer 加速镜像([加速原理](https://learnku.com/php/wikis/30594)):2.新建一个名为 Laravel 的项目&a…

gfast前端UI:基于Vue3与vue-next-admin适配手机、平板、pc 的后台开源模板

摘要 随着现代软件开发的高效化需求,一个能够快速适应不同设备、简化开发过程的前端模板变得至关重要。gfast前端UI,基于Vue3.x和vue-next-admin,致力于提供这样一个解决方案。本文将深入探讨gfast前端UI的技术栈、设计原则以及它如何适配手机…

(补充):java各种进制、原码、反码、补码和文本、图像、音频在计算机中的存储方式

文章目录 前言一、进制1 逢几进一2 常见进制在java中的表示3 进制中的转换(1)任意进制转十进制(2)十进制转其他进制二、计算机中的存储1 计算机的存储规则(文本数据)(1)ASCII码表(2)编码规则的发展演化2 计算机的存储规则(图片数据)(1)分辨率、像素(2)黑白图与灰度…

Linux 复现Docker NAT网络

Linux 复现Docker NAT网络 docker 网络的构成分为宿主机docker0网桥和为容器创建的veth 对构成。这个默认网络命名空间就是我们登陆后日常使用的命名空间 使用ifconfig命令查看到的就是默认网络命名空间,docker0就是网桥,容器会把docker0当成路由&…

linux nethogs网络监控程序(端口监控、流量监控、上传流量、下载流量、进程监控进程网络)

文章目录 Nethogs 网络监控程序详解1. 引言2. Nethogs 的安装与运行2.1 安装 Nethogs- **Debian/Ubuntu**- **Fedora**- **Arch Linux** 2.2 运行 Nethogs 3. Nethogs 的使用详解3.1 基本界面- **PID**:进程的 ID。- **用户**:运行该进程的用户。- **程序…

【Linux网络】数据链路层【上】{初识数据链路层/以太网/路由表/MAC地址表/ARP表/NAT表}

文章目录 1.初识数据链路层2.认识以太网2.0前导知识以太网帧和MAC帧CMSA/CD以太网的最小帧长限制是64字节IP层和MAC层 2.1以太网帧格式 3.预备知识计算机网络通信以太网和wifi路由表/MAC地址表/ARP表/NAT表/ACL表 用于同一种数据链路节点的两个设备之间进行信息传递。 1.初识数…

美团一面,你碰到过CPU 100%的情况吗?你是怎么处理的?

本文主要分为三部分 分析一下CPU 100%的常见原因 CPU 100%如何排查 回答这个问题的一个参考答案 CPU被打满的常见原因 1. 死循环 在实际工作中,可能每个开发都写过死循环的代码。 死循环有两种: 在 while、for、forEach 循环中的死循环。 无限递…

期末成绩单怎么单独发给家长,这个小工具超简单!

随着期末考试的落幕,老师们再次迎来了成绩处理的高峰期。传统的成绩单分发方式不仅耗时,还容易出错。但如今,有了易查分小程序,这一过程变得简便而高效。 易查分小程序,一个专为教师和家长设计的便捷工具,让…

[ruby on rails]部署时候产生ActiveRecord::PreparedStatementCacheExpired错误的原因及解决方法

一、问题: 有时在 Postgres 上部署 Rails 应用程序时,可能会看到 ActiveRecord::PreparedStatementCacheExpired 错误。仅当在部署中运行迁移时才会发生这种情况。发生这种情况是因为 Rails 利用 Postgres 的缓存准备语句(PreparedStatementCache)功能来…

【Apache Doris】周FAQ集锦:第 10 期

【Apache Doris】周FAQ集锦:第 10 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目! 在这个栏目中,每周将筛选社区反馈的热门问题和话题,重点回答并进行深入探讨。旨在为广大用户…

算法力扣刷题记录 四十五【110.平衡二叉树】

前言 二叉树篇继续 记录 四十五【110.平衡二叉树】 一、题目阅读 给定一个二叉树,判断它是否是 平衡二叉树。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:true示例 2: 输入:root [1,2,2,3,3…

【鸿蒙学习笔记】尺寸设置・width・height・size・margin・padding・

官方文档:尺寸设置 目录标题 width:设置组件自身的宽度height:设置组件自身的高度size:设置高宽尺寸margin:设置组件的外边距padding:设置组件的内边距 width:设置组件自身的宽度 参数为Length…

【零基础】学JS之APIS第三天

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

10分钟快速了解神经网络(Neural Networks)

神经网络是深度学习算法的基本构建模块。神经网络是一种机器学习算法,旨在模拟人脑的行为。它由相互连接的节点组成,也称为人工神经元,这些节点组织成层次结构。 Source: victorzhou.com 神经网络与机器学习有何不同? 神经网络是…

电脑资料丢失不用慌,5招教你恢复数据

在数字化时代,电脑资料的安全与完整对我们而言至关重要。然而,生活中总有一些小插曲,如意外删除、系统故障或病毒攻击等,导致电脑上的重要资料消失得无影无踪。面对这种情况,我们往往感到焦虑和无助。今天,…