MySQL B+树索引 和 Redis 中跳表索引的区别

一、MySQL B+树索引 和 Redis 中跳表索引

MySQL 中常用的索引是 B+树索引,而 Redis 中,例如 zset 使用的的是跳表索引,两者有什么区别呢,MySQL 为什么不使用 跳表 呢?或者说 Redis 中为什么不使用 B+树 呢?

下面先分别了解下 B+树和跳表的工作原理。

二、B+树

B+树是 B树的变体,B+树对比 B树,将B树的一个节点同时存放主键和数据的形式,改为叶子节点和非叶子节点形式。其中非叶子节点不存储具体数据,只存放主键和指向下一级数据的指针。而叶子节点在最尾端,存放主键和指向数据行的地址。叶子节点和非叶子节点采用指针连接,提高区间访问的性能。结构如下:

在这里插入图片描述

MySql 每次从磁盘读取数据是以页的形式读取,默认一页的大小为16k。这里假设每个主键占用8个字节,指针占6个字节,那么mysql 一次从磁盘读取 16k 就可以拿到 1024*16/(8+6)= 1170 条数据,假设树的高度为两级,这两次磁盘 IO 操作就可以大概涵盖 1170*1170 =1368900 查不到一百多万条数据,由此可见 B+树 效率之高。

此外 B+ 树能保证如此高的查询性能,关键点还在于B+树结构的平衡,这样就需要在插入数据的时候额外计算和调整树的平衡操作,一定程度降低了写的性能,下面来看下写的过程。

比如,当一个树节点最多可以存放5个索引的时候,在写入前 5 个数据的时候都不会触发树的平衡:

在这里插入图片描述

但是写入第6个数据的时候,因为一个节点最大放5个索引,所以下一步需要平衡,只能拆成二级结构:

在这里插入图片描述
由于最大的节点中有三个索引,所以下面两次写入,都不会触发平衡:

在这里插入图片描述
再次写入的时候,就需要进行平衡了,但是最上层的节点只有一个索引,所以可以在第一层加一个索引,第二层分三个节点:

在这里插入图片描述
依次类推,可以极大的较少树的层级。

所以 B+ 树通过空间换时间的方式,使用不同的叶子结点构建索引层级,将查询的时间复杂度从全表检索的O(n) 优化为O(lg(n))

三、跳表

跳表是一个随机化的数据结构,实质就是一种可以进行二分查找的有序链表。跳表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找。跳表不仅能提高搜索性能,同时也可以提高插入和删除操作的性能。

在这里插入图片描述

例如上述结构,假如需要查询主键为 7 的数据,首先在第一层从左向右可以找出在 6 之后、11 之前,然后进到 6 的下一层,继续从左向右可以找出在 6 之后、8 之前,然后进到 6 的下一层,从左向右就可以找到 7 了。

整体有点类似二叉树,但最后一层是全部的数据,上层通过增加跳跃点的方式加速检索的过程,并且跳跃点采用随机概率的方式决定是否增加,如果是两层跳跃层的话,在第一层加索引的概率就是 50% 概率,到第二层就是 25% 的概率 ,这样如何数据量样本足够大的话,数据的分布可以基本达到二分的效果。

由于每次写入数据,都随机决定是否要在每层增加索引,所以写入效率非常高。

例如写入数据9,首先在最后一层新增数据:

在这里插入图片描述

四、总结

MySQL 是磁盘存储的数据库系统,其中性能瓶颈在于磁盘IO的性能,而 B+树,以叶子节点和非叶子节点存储多索引的方式极大降低树的层级,在磁盘访问时能够保持较好的局部性,也大大降低了磁盘的读取次数,可以有效提升读取的性能。而跳表由于其随机指针的特性,在磁盘访问时可能导致更多的随机IO操作,影响访问效率。跳表在存储空间利用率上也不占优势。跳表需要维护多级索引,可能会导致额外的空间消耗,尤其是在数据量较大时,这种空间开销会变得非常显著。因此对比下来, B+树更适合 MySQL

Redis 是基于内存的数据库,数据操作都在内存中进行,无需关注磁盘IO,所以即使层级增大也影响不大,但是 B+树写数据时需要进行树平衡操作,反而影响了写的性能。而且跳表相对于B+树来说实现更加简单,代码量更少,容易理解和维护。在内存数据库中,简单且高效的实现是非常重要的考虑因素。跳表在支持范围查询方面比较灵活,插入、删除和查找操作的时间复杂度都是O(log n),这使得跳表在处理范围查询时表现较好。因此对比下来 Reids 中跳表的效果更好。

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

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

相关文章

AT25HP256/512

关于AT25HP256/512系列串行EEPROM(电气可擦可编程只读存储器)的数据手册,由Atmel公司发布。这些存储器通过串行外设接口(SPI)与微控制器等设备通信,并提供高可靠性的数据存储解决方案。以下是文档内容的翻译…

章节10实验--Ubuntu18.04 Qt MySQL libqsqlmysql.so

前言: 内容参考《操作系统实践-基于Linux应用与内核编程》一书的示例代码和教材内容,所做的读书笔记。本文记录再这里按照书中示例做一遍代码编程实践加深对操作系统的理解。 引用: 《操作系统实践-基于Linux应用与内核编程》 作者:房胜、李旭健、黄…

golang 对接第三方接口 RSA 做签(加密) 验签(解密)

一、过程 1.调用第三方接口前,一般需要按规则将参数按key1value1&key2value2 阿斯克码排序,sign参数不参与加密 2.将排序并连接好的参数字符串通过我方的私钥证书(.pem)进行加密得到加密串,当然加密得到的是 []byte 字节流&…

变量赋值篇

文章目录 变量赋值增量赋值多重赋值多元赋值合法的标识符 变量赋值 在Python中,变量赋值是一个简单的操作,你可以使用等号()来将一个值赋给一个变量。以下是一些基本的变量赋值示例: # 整数赋值 x 10# 浮点数赋值 y…

Excel文件导入导出,SpringBoot整合EasyExcel批量导入导出,采用的JDBC+EasyExcel(附带整个Demo)

目录 0.为什么mybatis的foreach比JDBC的addBatch慢 1.引入依赖 2.Controller层 3.Service层 4.Utils工具类 5.自定义监听器 6.实体类 7Mapper层 不用Mybatis的原因就是因为在大量数据插入的时候jdbc性能比mybatis好1. 首先分批读取Excel中的数据 这一点EasyExcel有自己…

看完就等于拿捏浮点数在内存中的储存了

诸君又该学习了,今天我们继续来一睹浮点数的奥妙真容。 经过前面文章对整形提升相关的解释,我们都对整形和字符在内存空间上的储存已经有了大概的认知,那么现在我们就来好好讲讲浮点数在内存中的储存规则。 目录 浮点数与整形储存的不同 …

41-Vue-webpack基础

webpack基础 前言什么是webpackwebpack的基本使用指定webpack的entry和output 前言 本篇开始来学习下webpack的使用 什么是webpack webpack: 是前端项目工程化的具体解决方案。 主要功能:它提供了友好的前端模块化开发支持,以及代码压缩混淆、处理浏览…

自定义序列化

3.2.2.自定义序列化 RedisTemplate可以接收任意Object作为值写入Redis: 只不过写入前会把Object序列化为字节形式,默认是采用JDK序列化,得到的结果是这样的: 缺点: 可读性差内存占用较大 我们可以自定义RedisTempla…

NASA数据集——2015 年30 米分辨率的地衣地面覆盖率模型估计值

cABoVE: Lichen Forage Cover over Fortymile Caribou Range, Alaska and Yukon, 2000-2015 文件修订日期:2021-07-21 数据集版本: 1 摘要 本数据集提供了美国阿拉斯加东部内陆和加拿大育空地区 Fortymile 研究区 2015 标称年 30 米分辨率的地衣地面覆盖率模型估…

modbus代码思路整理

void main() { eMBinit(); eMBEnable();/*1.eRcvState = STATE_RX_INIT 2.USART:USART_RX->Enable & USART_TX->Disable 3.打开TIM(5ms):Enable 4.eMBState = STATE_ENABLE*/ while(1) {…

YOLOv8-ROS-noetic+USB-CAM目标检测

环境介绍 Ubuntu20.04 Ros1-noetic Anaconda-yolov8虚拟环境 本文假设ROS和anaconda虚拟环境都已经配备,如果不知道怎么配备可以参考: https://blog.csdn.net/weixin_45231460/article/details/132906916 创建工作空间 mkdir -p ~/catkin_ws/srccd ~/ca…

SQL注入四-PHP应用SQL二次注入堆叠执行DNS带外功能点黑白盒条件

演示案例: PHP-MYSQL-二次注入-DEMO&74CMSPHP-MYSQL-堆叠注入-DEMO&CTF强网PHP-MYSQL-带外注入-DEMO&DNSLOG #PHP-MYSQL-二次注入-DEMO&74CMS 1、DEMO-用户注册登录修改密码 2、CMS-74CMS个人中心简历功能 黑盒思路:分析功能有添加后对数…

dom元素+CSS实现阶梯动画效果

1.效果 2.代码实现 <template><div class"container"><div class"Box"><div class"box" style"background-color: red;"></div><div class"box" style"background-color: orange;&q…

湖北专升本报名照片需要<40kb怎么解决

湖北专升本报名照片需要<40kb怎么解决

vue 修改element-plus主题色

一、安装SCSS npm install sass --save-dev npm install sass-loader --save-dev npm install node-sass --save-dev npm install vue-style-loader --sava-dev 二、添加主题文件theme.scss forward "element-plus/theme-chalk/src/common/var.scss" with ($col…

特种兵旅游-扬州、南京

一、扬州 Day01 西安咸阳机场->扬州泰州机场&#xff08;扬州地界但是离泰州也嘎嘎近&#xff09;->大运河博物馆&#xff08;需要提前预约&#xff01;&#xff09;&#xff08;超级震撼&#xff09; Day02 瘦西湖&#xff08;门票有点贵&#xff0c;但是蛮值得&#x…

kubernetes负载均衡-service

一、service的概念 1、什么是service 在Kubernetes中&#xff0c;pod是应用程序的载体&#xff0c;当我们需要访问这个应用时&#xff0c;可以通过Pod的IP进行访问&#xff0c;但是这里有两个问题:1、Pod的IP地址不固定&#xff0c;一旦Pod异常退出、节点故障&#xff0c;则会…

量子计算与大模型融合的潜力与挑战探索

量子计算与大模型融合的潜力与挑战探索 1. 背景介绍 随着人工智能技术的飞速发展&#xff0c;大模型在自然语言处理、计算机视觉等领域取得了显著的成果。然而&#xff0c;大模型训练需要大量的计算资源&#xff0c;导致训练时间长、能耗高。量子计算作为一种新型计算方式&am…

【STM32】读写BKP备份寄存器RTC实时时钟

目录 BKP BKP简介 BKP基本结构 BKP测试代码 RTC RTC简介 RTC框图 RTC基本结构 硬件电路 RTC操作注意事项 接线图 初始化 使用BKP解决只初始化一次时间 初始化参考代码 RTC设置时间 RTC读取时间 完整代码 MyRTC.c MyRTC.h main.c BKP BKP简介 BKP&#xff0…

渗透测试-ssh私钥泄露知识记录

1 ssh私钥泄露 1.1 信息探测 渗透其实是针对服务的漏洞探测&#xff0c;然后进行数据包的发送&#xff0c;获取机器的最高权限。 nmap –sV 192.168.0.1常用端口0-1023端口&#xff0c;在扫描结果中查找特殊端口&#xff0c;针对特殊端口进行探测&#xff0c;尤其是对开放大端…