聊聊Mysql索引和redis跳表

聊聊MySQL索引和redis跳表 ---redis的有序集合zset数据结构底层采用了跳表原理 时间复杂度O(logn)(阿里)redis使用跳表不用B+数的原因是:redis是内存数据库,而B+树纯粹是为了mysql这种IO数据库准备的 。B+树的每个节点的数量都是一个mysql分区页的大小(阿里面试)
敲黑板:每级遍历 3 个结点即可,而跳表的高度为 h ,所以每次查找一个结点时,需要遍历的结点数为 3*跳表高度 ,所以忽略低阶项和系数后的时间复杂度就是 ○(㏒n),空间复杂度是O(n)

聊聊Mysql索引和redis跳表

文章插图
 
问题如果对以下问题感到困惑或一知半解,请继续看下去,相信本文一定会对你有帮助
  • mysql 索引如何实现
  • mysql 索引结构B+树与hash有何区别 。分别适用于什么场景
  • 数据库的索引还能有其他实现吗
  • redis跳表是如何实现的
  • 跳表和B+树,LSM树有何区别呢
解析首先为什么要把mysql索引和redis跳表放在一起讨论呢,因为他们解决的都是同一种问题,用于解决数据集合的查找问题,即根据指定的key,快速查到它所在的位置(或者对应的value)
当你站在这个角度去思考问题时,还会不知道B+树索引和hash索引的区别吗
数据集合的查找问题现在我们将问题领域边界划分清楚了,就是为了解决数据集合的查找问题 。这一块需要考虑哪些问题呢
  1. 需要支持哪些查找方式,单key/多key/范围查找,
  2. 插入/删除效率
  3. 查找效率(即时间复杂度)
  4. 存储大小(空间复杂度)
我们看下几种常用的查找结构
hash
聊聊Mysql索引和redis跳表

文章插图
 
hash是key,value形式,通过一个散列函数,能够根据key快速找到value
B+ 树:
注意 这是关于B+树的总结,如果你掌握到这个程度 是远远不够的,
B+树 的数据都在叶子节点,非叶子节点存放 索引
聊聊Mysql索引和redis跳表

文章插图
 
B+树是在平衡二叉树基础上演变过来,为什么我们在算法课上没学到B+树和跳表这种结构呢 。因为他们都是从工程实践中得到,在理论的基础上进行了妥协 。
B+树首先是有序结构,为了不至于树的高度太高,影响查找效率,在叶子节点上存储的不是单个数据,而是一页数据,提高了查找效率,而为了更好的支持范围查询,B+树在叶子节点冗余了非叶子节点数据,为了支持翻页,叶子节点之间通过指针连接 。
跳表
redis跳表视频讲解点击链接:「链接」
C/C++linux服务器开发精彩内容包括:C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,MongoDB,ZK,流媒体,P2P,Linux内核,Docker,TCP/IP,协程,DPDK多个高级知识点学习视频资料点击:C/C++Linux服务器开发/后台架构师【零声学院】-学习视频教程-腾讯课堂
C/C++Linux后台服务器开发技术交流qun:正在跳转
聊聊Mysql索引和redis跳表

文章插图
 
跳表:为什么 Redis 一定要用跳表来实现有序集合?上几篇主要是学习二分查找算法,但是二分查找底层依赖的是数组随机访问的特性,所以只能用数组来实现 。如果数据存储在链表中,就没办法使用二分查找了吗?
此时跳表出现了,跳表(Skip list) 实际上就是在链表的基础上改造生成的 。
跳表是一种各方面性能都比较优秀的 动态数据结构,可以支持快速的插入、删除、查找操作,写起来也不复杂,甚至可以替代 红黑树?? 。
Redis 一共有5种数据结构,包括:
1、字符串(String)
redis对于KV的操作效率很高,可以直接用作计数器 。例如,统计在线人数等等,另外string类型是二进制存储安全的,所以也可以使用它来存储图片,甚至是视频等 。
2、哈希(hash)
存放键值对,一般可以用来存某个对象的基本属性信息,例如,用户信息,商品信息等,另外,由于hash的大小在小于配置的大小的时候使用的是ziplist结构,比较节约内存,所以针对大量的数据存储可以考虑使用hash来分段存储来达到压缩数据量,节约内存的目的,例如,对于大批量的商品对应的图片地址名称 。比如:商品编码固定是10位,可以选取前7位作为hash的key,后三位作为field,图片地址作为value 。这样每个hash表都不超过999个,只要把redis.conf中的hash-max-ziplist-entries改为1024,即可 。
3、列表(List)
列表类型,可以用于实现消息队列,也可以使用它提供的range命令,做分页查询功能 。


推荐阅读