摘要

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

问题

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

mysql 索引如何实现

mysql 索引结构B+树与hash有何区别。分别适用于什么场景

数据库的索引还能有其他实现吗

redis跳表是如何实现的

跳表和B+树,LSM树有和区别呢

解析

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

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

数据集合的查找问题

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

需要支持哪些查找方式,单key/多key/范围查找,

插入/删除效率

查找效率(即时间复杂度)

存储大小(空间复杂度)

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

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),只用处理链表,算法比较简单

mysql索引和redis比较_聊聊Mysql索引和redis跳表相关推荐

  1. mysql主从数据库同步问题_聊聊MySQL主从数据库同步的那些事儿

    在linux服务器下测试:主(master)服务器IP:219.223.5.105(对应内网IP:192.168.1.75)从(slave)服务器IP:219.223.5.104(对应内网IP:192 ...

  2. java数据结构红黑树上旋下旋_存储系统的基本数据结构之一: 跳表 (SkipList)

    在接下来的系列文章中,我们将介绍一系列应用于存储以及IO子系统的数据结构.这些数据结构相互关联又有着巨大的区别,希望我们能够不辱使命的将他们分门别类的介绍清楚.本文为第一节,介绍一个简单而又有用的数据 ...

  3. mysql5.6 函数索引_聊聊MySQL中的索引

    关于MySQL中的索引使用 索引是数据库优化中最常用也是最重要的手段之一,通过索引通常可以帮助用户解决大多数的SQL性能问题. 索引的存储分类: 1.B-Tree索引:最常见的索引类型,大部分引擎都支 ...

  4. mysql索引如何分裂节点_从MySQL Bug#67718浅谈B+树索引的分裂优化(转)

    原文链接:http://hedengcheng.com/?p=525 问题背景 今天,看到Twitter的DBA团队发布了其最新的MySQL分支:Changes in Twitter MySQL 5. ...

  5. mysql distinct多个字段_深入浅出Mysql索引的那些事儿

    一.索引的作用 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重. 在数据 ...

  6. mysql技术内幕innodb存储引擎——表索引算法和锁_(转)Mysql技术内幕InnoDB存储引擎-表索引算法和锁...

    表 原文:http://yingminxing.com/mysql%E6%8A%80%E6%9C%AF%E5%86%85%E5%B9%95innodb%E5%AD%98%E5%82%A8%E5%BC% ...

  7. mysql隐式锁定辅助索引_当Mysql - InnoDB行锁遇到复合主键和多列索引-Go语言中文社区...

    背景 今天在配合其他项目组做系统压测,过程中出现了偶发的死锁问题.分析代码后发现有复合主键的update情况,更新复合主键表时只使用了一个字段更新,同时在事务内又有对该表的insert操作,结果出现了 ...

  8. mysql使用索引扫描做排序_「Mysql索引原理(八)」使用索引扫描做排序

    MySQL有两种方式可以生成有序的结果:通过排序操作:或者按索引顺序扫描:如果explain出来的type列的值为index,则说明MySQL使用了索引扫描来做排序. 扫描索引本身是很快的,因为只需要 ...

  9. mysql 按时间累计计算_精通MySQL索引背后的数据结构及算法原理

    本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,mysql支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree ...

最新文章

  1. 690啊690,你不是找骂吗?
  2. javascript判断数组是否包含了指定的元素
  3. Visual C#使用DirectX实现视频播放
  4. 2.2 逻辑回归-机器学习笔记-斯坦福吴恩达教授
  5. CodeForces 340C
  6. win7的开机启动项怎么管理 win7管理开启启动项的方法
  7. 【Matlab】离散点拟合曲面
  8. css上传图片中等待不可点击效果
  9. Windows ESXI 5.5 升級到 VCSA 6.5
  10. 学习 Message(13): 解析 TWMMouse.Keys 参数
  11. 电脑的服务器操作系统是什么,电脑的服务器操作系统是什么
  12. matlab vec2ind,MATLAB函数ind2vec的作用
  13. my java note -------String 类的实例化
  14. 创建一个基础WDM驱动,并使用MFC调用驱动
  15. 中国资源卫星应用中心免费卫星遥感数据介绍
  16. 单调栈-leetcode-739. 每日温度
  17. Bebras挑战样题之五——警察能抓住海盗吗?
  18. 计算机语言学习书籍目录资源自己找(到处复制粘贴的目录)
  19. 如何求有序数组绝对值最小的数
  20. P1714 切蛋糕(线段树+前缀和)

热门文章

  1. Web App:赌的就是互联网未来并 非无可挑剔
  2. c语言编程sinx泰勒公式_大白话5分钟带你走进人工智能-第12节梯度下降之原理泰勒公式(7)...
  3. 成功解决1406, “Data too long for column ‘txt‘ at row 1“
  4. 单步ARM汇编解开volatile本质
  5. Mac下docker安装kali/ubuntu14.04
  6. emacs coding UTF-8 保存报错
  7. 视频编解码(二):编解码器基础知识
  8. 服务器BIOS、BMC、IPMI、EFI、UEFI等知识详解
  9. linux命令大全-比较常用的
  10. html鼠标平滑滚动效果,JS特效代码 JS动态平滑滚动菜单效果