聊聊MySQL索引和redis跳表 ---redis的有序集合zset数据结构底层采用了跳表原理 时间复杂度O(logn)(阿里)redis使用跳表不用B+数的原因是:redis是内存数据库,而B+树纯粹是为了mysql这种IO数据库准备的 。B+树的每个节点的数量都是一个mysql分区页的大小(阿里面试)
敲黑板:每级遍历 3 个结点即可,而跳表的高度为 h ,所以每次查找一个结点时,需要遍历的结点数为 3*跳表高度 ,所以忽略低阶项和系数后的时间复杂度就是 ○(㏒n),空间复杂度是O(n)
文章插图
问题如果对以下问题感到困惑或一知半解,请继续看下去,相信本文一定会对你有帮助
- mysql 索引如何实现
- mysql 索引结构B+树与hash有何区别 。分别适用于什么场景
- 数据库的索引还能有其他实现吗
- redis跳表是如何实现的
- 跳表和B+树,LSM树有何区别呢
当你站在这个角度去思考问题时,还会不知道B+树索引和hash索引的区别吗
数据集合的查找问题现在我们将问题领域边界划分清楚了,就是为了解决数据集合的查找问题 。这一块需要考虑哪些问题呢
- 需要支持哪些查找方式,单key/多key/范围查找,
- 插入/删除效率
- 查找效率(即时间复杂度)
- 存储大小(空间复杂度)
hash
文章插图
hash是key,value形式,通过一个散列函数,能够根据key快速找到value
B+ 树:
注意 这是关于B+树的总结,如果你掌握到这个程度 是远远不够的,
B+树 的数据都在叶子节点,非叶子节点存放 索引
文章插图
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:正在跳转
文章插图
跳表:为什么 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命令,做分页查询功能 。
推荐阅读
- MySql安装全攻略,如果想好好学习,一篇就够了
- 线上 MySql 事务死锁,应该怎么排查解决?
- 新手教程,Linux系统下MySQL的安装
- JDBC+MySQL入门增删改查实战
- 聊聊宋代的茶马贸易,宋代的茶发展茶叶茶课
- 搭建mysql主从并用springboot读写分离-含源码
- MySQL如何删除重复数据
- MySQL运行机制
- 聊聊茶叶的选择,喝茶能治痛风吗
- MySQL5.7数据库主从架构部署,你再也不用去问度娘了