聊聊Mysql索引和redis跳表

摘要

面试时,交流有关mysql索引问题时,发现有些人能够涛涛不绝的说出B+树和B树,平衡二叉树的区别,却说不出B+树和hash索引的区别。这种一看就知道是死记硬背,没有理解索引的本质。本文旨在剖析这背后的原理,欢迎留言探讨

问题

如果对以下问题感到困惑或一知半解,请继续看下去,相信本文一定会对你有帮助

  • mysql 索引如何实现
  • mysql 索引结构B+树与hash有何区别。分别适用于什么场景
  • 数据库的索引还能有其他实现吗
  • redis跳表是如何实现的
  • 跳表和B+树,LSM树有和区别呢

解析

首先为什么要把mysql索引和redis跳表放在一起讨论呢,因为他们解决的都是同一种问题,用于解决数据集合的查找问题,即根据指定的key,快速查到它所在的位置(或者对应的value)

当你站在这个角度去思考问题时,还会不知道B+树索引和hash索引的区别吗

数据集合的查找问题

现在我们将问题领域边界划分清楚了,就是为了解决数据集合的查找问题。这一块需要考虑哪些问题呢

  1. 需要支持哪些查找方式,单key/多key/范围查找,
  2. 插入/删除效率
  3. 查找效率(即时间复杂度)
  4. 存储大小(空间复杂度)

我们看下几种常用的查找结构

hash
在这里插入图片描述
hash是key,value形式,通过一个散列函数,能够根据key快速找到value
B+树
在这里插入图片描述
B+树是在平衡二叉树基础上演变过来,为什么我们在算法课上没学到B+树和跳表这种结构呢。因为他们都是从工程实践中得到,在理论的基础上进行了妥协。

B+树首先是有序结构,为了不至于树的高度太高,影响查找效率,在叶子节点上存储的不是单个数据,而是一页数据,提高了查找效率,而为了更好的支持范围查询,B+树在叶子节点冗余了非叶子节点数据,为了支持翻页,叶子节点之间通过指针连接。

跳表
在这里插入图片描述
跳表是在链表的基础上进行扩展的,为的是实现redis的sorted set数据结构。
level0: 是存储原始数据的,是一个有序链表,每个节点都在链上
level0+: 通过指针串联起节点,是原始数据的一个子集,level等级越高,串联的数据越少,这样可以显著提高查找效率,

总结

数据结构实现原理key查询方式查找效率存储大小插入、删除效率
Hash哈希表支持单key接近O(1)小,除了数据没有额外的存储O(1)
B+树平衡二叉树扩展而来单key,范围,分页O(Log(n)除了数据,还多了左右指针,以及叶子节点指针O(Log(n),需要调整树的结构,算法比较复杂
跳表有序链表扩展而来单key,分页O(Log(n)除了数据,还多了指针,但是每个节点的指针小于<2,所以比B+树占用空间小O(Log(n),只用处理链表,算法比较简单

对LSM结构感兴趣的可以看下cassandra vs mongo (1)存储引擎

有用点个赞,谢谢
在这里插入图片描述

参考

https://www.cnblogs.com/Elliott-Su-Faith-change-our-life/p/7545940.html

<p> <strong><span>Redis是一个key-value</span></strong><a href="https://baike.baidu.com/item/%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F"><strong><span>存储系统</span></strong></a><strong><span><span>。和</span>Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(</span></strong><a href="https://baike.baidu.com/item/%E9%93%BE%E8%A1%A8"><strong><span>链表</span></strong></a><strong><span>)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些</span></strong><a href="https://baike.baidu.com/item/%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B"><strong><span>数据类型</span></strong></a><strong><span><span>都支持</span>push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。</span></strong> </p> <p> <strong><span>Redis的出现,很大程度补偿了</span></strong><a href="https://baike.baidu.com/item/memcached"><strong><span>memcached</span></strong></a><strong><span><span>这类</span>key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。</span></strong> </p> <p> <strong><span>Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。</span></strong> </p> <p> <span>  </span></p><p> <strong><span> </span></strong> </p> <p> <strong><span>本课程主要讲解以下内容:</span></strong> </p> <p> <span>1. </span><strong><span>Redis的基本使用</span></strong> </p> <p> <span>2. </span><strong><span>Redis数据库的数据类型</span></strong> </p> <p> <span>3. </span><strong><span>Redis数据库数据管理</span></strong> </p> <p> <span>4. </span><strong><span>Redis的主从复制</span></strong> </p> <p> <span>5. </span><strong><span>Redis数据库的持久性</span></strong> </p> <p> <span>6. </span><strong><span>Redis的高可靠性和集群</span></strong> </p> <p> <span>7. </span><strong><span>Redis的优化和性能测试</span></strong> </p> <p> <span>8. </span><strong><span>Redis服务器的维护和管理</span></strong> </p> <p> <span>9. </span><strong><span>Redis服务器的常见问题排错</span></strong> </p> <p> <strong><span> </span></strong> </p> <img src="https://img-bss.csdn.net/201908300910404009.png" alt="" />
相关推荐
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页