MySQL索引为什么不用跳表,Redis为什么不用B+树

知识引入

在讲述问题之前,我相信来到这里的朋友一定都是事先了解过 B+ 树、跳表这两种数据结构了的。

所以下面介绍这两种数据结构的时候,只是整体描述一下,并不会细致地讲什么是 B+ 树,什么是跳表;毕竟咱们今天的主要内容并不是介绍数据结构。

什么是MySQL中的B+树?

  1. B+树一般由多个页、多层级组成,在MySQL中每个页 16 kb。
  2. 主键索引的 B+ 树的叶子结点才是数据,非叶子结点存放的是索引信息
  3. 上下层的页通过单指针相连
  4. 同一层级的相邻的数据页通过双指针相邻

B+ 树的大致图像如下:

什么是跳表?

跳表的结构就像是由单链表结构衍生出来的,但是它的效率却比普通的单链表高上很多
跳表的最底层是单链表,但是跳表也是具有多层级的

在普通的单链表中,不管要寻找什么元素,都是需要从头结点开始不断往下找,一个个找,直到找到为止,效率是非常低的;而使用了跳表就不一样了,比如要寻找 6 ,跳表只需要 1, 5, 6就找到了,而单链表则需要 1, 2, 3, 4, 5, 6。

从这小小的例子中,我们也能感受到跳表的查询效率确实是比单链表上升了不少

跳表和B+树的异同点

相同点:

两种数据结构的查询效率都是杠杠的,而且都支持范围查询,不然MySQL就不用 B+树,Redis就不用跳表了。

不同点(新增数据方面):

B+ 树在新增数据的时候可能面临页分裂的问题,而且它还需要维护各种索引页;
跳表在添加数据的时候,并没有什么页分裂的说法,就算是索引分配也是非常的简单的,它只需要利用一个随机函数随机出新增数据需要出现的层级数就可以了,最低层级就是该数据不建立索引,只待在最底层的单链表处。

前面讲述了这么多铺垫,下面终于开始进入咱们今天的正题了。。。

出发!

MySQL为什么不用跳表建立索引?

MySQL选用 B+ 树构建索引,主要是因为 B+ 树是多叉结构,而且根据它结构组织数据页/索引页,存放2kw数据也只是需要 3 层左右就可以了,目前实践中,B+树索引几乎没有超过 4 层,换句话说,如果是 B+ 树索引的话,查找一次数据,一般最多也就 3 次磁盘 IO ;而在跳表中就不一样了,2kw的数据在跳表中存储,如果想要达到二分查找的效率的话,最起码也要2^24层级才能实现,而每个层级的数据都是分散在不同的数据页中的,所以在查找数据的过程中,跳表可能需要进行 24次磁盘IO

我们都知道磁盘IO是非常消耗性能的,能够少磁盘IO就少磁盘IO的,所以单凭这个点跳表也不会被MySQL选做索引。
当然啦,以上的分析只是对于查询数据而言的,如果是就写数据而言的话,跳表会略胜一筹,因为在新增数据的时候,跳表不需要维护什么页,什么页的,它只需要一个随机数就可以了,显然高效。

既然MySQL都抛弃了跳表,为什么Redis中又要使用跳表呢??

Redis为什么要用跳表实现zset

相信各位学过Redis底层数据结构的都知道,Redis中的 Zset 底层是由跳表实现的!

为什么呢?

其实啊,主要是因为Redis是一个基于内存的数据库,它的数据几乎都在内存中,就算是使用跳表,就算 2kw数据会达到 2^24次方的层级,但是这些都不是问题,因为它们都是在内存中,不存在刚刚讨论的磁盘IO影响性能的问题。

而且Redis中使用跳表还不需要担心 B+树的页分裂之类的问题。

总结

问题一:MySQL为什么不用跳表?

跳表比B+树层级更高,需要更多的磁盘IO

问题二:Redis中为什么不用B+树?

Redis是基于内存的数据库,不用考虑磁盘IO问题,采用跳表,不用考虑B+树页分裂等问题

MySQL索引为什么不用跳表,Redis为什么不用B+树相关推荐

  1. Redis Zset的实现为什么用跳表,而不用平衡树?

    之前写过一篇 Redis 数据类型的底层数据结构的实现,其中提到,ZSet 对象的底层数据结构实现之一是跳表. 然后,有读者就问:为什么不使用平衡树(如红黑树.AVL 树)? 我们先来了解下跳表,再来 ...

  2. HashMap为什么用红黑树而不用跳表?redis的zset为什么用跳表而不用红黑树?

    问题引入 前些天在思考zset为什么用跳表而不用红黑树时,自然想到了HashMap为什么用红黑树而不用跳表,做了一些查询和考虑,以此记录结果 redis的zset为什么用跳表而不用红黑树? 1.跳表的 ...

  3. mysql索引列是锁表还是锁行_[转]关于MYSQL Innodb 锁行还是锁表

    关于mysql的锁行还是锁表,这个问题,今天算是有了一点头绪,mysql 中 innodb是锁行的,但是项目中居然出现了死锁,锁表的情况.为什么呢?先看一下这篇文章. 做项目时由于业务逻辑的需要,必须 ...

  4. 聊聊Mysql索引和redis跳表

    聊聊Mysql索引和redis跳表 ---redis的有序集合zset数据结构底层采用了跳表原理 时间复杂度O(logn)(阿里) redis使用跳表不用B+数的原因是:redis是内存数据库,而B+ ...

  5. Mysql的索引为什么使用B+树而不使用跳表?

    在我们的印象中,mysql数据表里无非就是存储一行行的数据.跟个excel似的. 直接遍历这一行行数据,性能就是O(n),比较慢.为了加速查询,使用了B+树来做索引,将查询性能优化到了O(lg(n)) ...

  6. 图解|深入理解跳表及其在Redis中的应用

    跳跃链表及其应用是非常热门的问题,深入了解其中奥秘大有裨益,不吹了,快开始品尝这美味的知识吧! 跳跃链表的基本概念 初识跳表 跳跃列表是一种数据结构.它允许快速查询一个有序连续元素的数据链表.跳跃列表 ...

  7. redis 源码分析 跳表实现

    redis中为什么要使用跳表的数据结构? reids 的zset有序集合的实现,需要兼顾方便的查找,插入和删除,如果使用链表,查找效率位O(N),这对redis不可接受,使用红黑树,则实现比较麻烦,所 ...

  8. 二叉树,平衡二叉树,B-Tree,B+Tree,跳表详解

    二叉树,平衡二叉树,B-Tree,B+Tree,跳表详解 1.二叉查找树(BST) 1.1 二叉查找树概念 1.2 二叉查找树特点 2. 平衡二叉树(AVL) 2.1 平衡二叉树概念 2.2 平衡二叉 ...

  9. 《破壁MySQL》 - MySQL索引

    文章每周六持续更新,可以微信搜一搜「 荒古传说 」抢先阅读. 在上一篇文章 「<破壁MySQL> - MySQL概述」 中我们简单介绍了MySQL 架构和 MySQL 存储引擎的相关知识, ...

最新文章

  1. 【卷积神经网络结构专题】一文详解AlexNet(附代码实现)
  2. 这 2 种程序员的惊人差距,实在不忍直视...
  3. cloud-init 工作原理 - 每天5分钟玩转 OpenStack(171)
  4. Linux I/O模型
  5. xcode工程命令行生成ipa安装包
  6. 测试:fiddler使用
  7. vue-router下的html5 history在iis服务器上的设置 vue去掉#
  8. 【区块链】2018全年比特币网络重要指标图表分析
  9. 民营银行是怎样炼成的:优中选优最终挑选出5家
  10. Linux 各种网卡信息查询方法
  11. oracle查看登录失败次数,Oracle取消用户连续登录失败次数限制
  12. [STL]priority_queue多种方式自定义排序
  13. 【微机原理作业】8086存储器读写实验
  14. 通过USB在传统电视上播放B站视频
  15. 拼多多参谋在什么地方?多多参谋的作用是什么?
  16. 记录一个IT菜鸟的成长之路。
  17. 软件研发类应届毕业生培养考核的三个阶段
  18. 卡夫卡详解_卡夫卡概念
  19. 技美 百人计划 (图形)1.1渲染流程
  20. linux进程操作相关函数,Linux进程控制简介与要素及相关函数详解

热门文章

  1. xtu P1074 珍珠
  2. AI行业态势感知(第二期)
  3. 小米打开usb调试还是连不上
  4. protobuf 归纳
  5. NewCoder 排队
  6. 紫外线消毒水处理设备的杀菌速度快吗?
  7. Polycom Soundstation连接IP电话系统
  8. ROS2入门之基本介绍
  9. 适配器模式 :Adapter(转自阿良.NET)
  10. 交换机交换容量与包转发率的关系