深入理解mysql索引数据结构与算法腾讯云开发者社区

在mysql中,索引就是帮助mysql快速找到某条数据的一种数据结构,它是排好序的,独立于mysql表数据之外的。

二叉树、红黑树、Hash表、B树。

在这里我们主要介绍hash表和B树

什么是hash? hash是一种散列函数,通过将输入值映射为一个数值,如:hash(100) = 1,不同的hash算法,hash之后的值有可能是不同的。Hash表是以数据映射形式存在于mysql中的,那么hash表是如何产生的呢?当添加一条数据到表中的时候,首先会对主键进行hash,然后将这条数据存在的地址和hash值建立一个映射关系,当我们根据主键查找这条数据的时候,只需要将主键进行hash,得到hash值,最后根据hash值就可以直接定位到这条数据。所以hash算法只需要进行一次磁盘IO,查询速度是非常快的。

在这里插入图片描述

B树又称为多叉树,它在二叉树的基础之上,划分出来多个叉,我们看下它的数据结构图示。

我们从图中可以看出B树具有这几种特性:1.节点从左到右递增排序 2.每个数据节点后面都会紧跟着一个指针,该指针是指向下一级的内存地址。下一级指的是位于当前指针左右两边数值中间的数据记录所存在内存中的地址。3.叶子节点 的指针为空 4.所有索引元素是不重复的。5.每个索引节点都存着当前指向的记录数据(或内存地址)

B+树其实是B树的一个变种,它在B树的基础之上做了一些改善,将索引节点所关联的数据记录全部移到叶子节点上了,目的是为了可以存储更多的索引节点,但是却增加了索引节点的冗余,因为叶子节点包含了所有的索引节点。

在这里插入图片描述

从图中可以看出,B+树具有以下几个特性:1.叶子节点包含所有的索引节点 2.非叶子节点不存储数据记录 3.叶子节点之间使用指针连接,提高区间访问的便利 4.指针所指向的索引节点的最左边都是大于等于指针所在深度左边的值

我们看下mysql中的B+树长什么样子的

在这里插入图片描述

1.增加了一个双向的指针 2.首尾节点也通过指针进行关联起来 主要目的是为了更加友好的支持索引内部的范围查找。如果不加双向链表指针,我们每次查找的时候,都要回到根节点查找,增加了磁盘IO,增加查询时间。

在mysql中,可以使用SHOW GLOBAL STATUS LIKE 'Innodb_page_size%'指令查找到mysql对索引节点页面大小的设置,这个参数的大小决定了我们一次性能够从磁盘盘中load出多少索引数量。在5.7版本中Innodb_page_size 默认设置为16384,也就是16k。我们现在计算下myssql中,如果存储引擎为innodb的话,大概能支撑多少量级的数据?我们按照高度为3的树进行计算:

1.按照每个bigint数据类型的字段存储,每个非叶子索引节点最多需要8B2.再加上每个索引节点后面连接的指针,指针在innodb中设置的大小为6B3.两者加起来总共14B,所以一级节点总共能存储 16kB/14B = 1170个索引节点4.二级节点都是从一级节点划分出来,也就是一级节点中的每个节点又能划分出1170个,所以二级节点和一级节点总共能存储1170*1170 = 1368900个 索引节点。5.三级节点也就是叶子节点,叶子节点存储的是主键值+记录数据,记录数据最多为1K,这个时候主键值8B可以忽略不计了,所以每个叶子节点最多能存储16k/1k = 16条记录。

6.所以Innodb引擎结构的表中最多能支撑1170117016 = 21902400 条数据,大概21亿,如果大于这个值,基本上都需要进行分库分表了,mysql建议B+树的深度最好小于3.

在上面说过,hash算法,在查找数据的时候只用进行一次磁盘IO,查询速度非常快,但是为什么mysql不推荐使用呢?主要有以下几个原因

2.无法进行范围查询(因为hash表里面存放的是hash值,不是数据本身,所以无法进行数据的比较,如果你确定你的表中只会用到精准查找的话,则可以使用hash结构的索引)

1.增加了双向链表,便于范围查找.

2.只有叶子节点才存储数据记录,意味着可以存储更多的索引节点.

聚集(聚簇)索引:索引文件与数据文件是合并在一起存放的 非聚集(聚簇)索引:索引文件与数据文件是独立存放的

主键索引:在innodb中默认使用B+ tree结构类型,存储的是聚集索引,叶子结点的data区域存储的是当前主键关联的整条记录 辅助键:辅助键的data区域存储的是主键值,也就是说如果使用辅助键索引查询,最后还得通过主键值查找对应的记录。

myisam存储引擎的索引,不管主键还是辅键索引,data区域保存的都是所关联数据的内存地址,因为myisam是非聚集索引,索引文件和数据文件是分开存储的。

1.为什么Innodb表必须有主键?

在innodb存储引擎表中,mysql会给主键添加聚集索引,如果没有主键,mysql则会选举表中设置了唯一索引的字段设置为主键,创建主键索引;如果表中没有字段设置为唯一索引,则mysql会生成一个row_id,作为主键,创建主键索引。

2.为什么mysql推荐使用整形作为主键字段类型?

在组建B树的时候,mysql会按照从小到大的顺序进行组建,如果是整形数字的话,mysql则可以直接进行比较,如果是其它类型的话,mysql还得需要将值转换为ascill码,进行比较,会增加创建索引和查询的时间。

3.为什么要求是自增类型?

这是由mysql限制条件决定的:

假如现在主键不是自增的,这时候如果加入了一个新的值11,那么通过比较之后,11是需要存储在10和12之间的:

2.如果按照字段设置为自增的,则不会插入比当前序号小的数据,只需要在右边继续扩充就行,不会出现节点分裂的情况。

1.如果存储的是具体的数据的话,会造成数据不一致的问题,因为主键索引和辅助索引会同时维护数据记录,如果有一方维护失败则会出现不一致性的问题

THE END
0.​产品结构指的是什么分哪几种,产品的定义与分类产品结构分哪几种 产品结构在用户需求分析和用户体验设计中扮演着重要的角色。常见的产品结构分为四大类型:树状结构、线性结构、矩阵结构和自然结构。 1、树状结构 树状结构是一种层次化的结构,其中每个节点都有一个父节点和零个或多个子节点。常见的例子是文件系统的目录结构,其中根目录是顶层节点,每个文件夹是一个子节点,文件夹中的文件是叶子节点。 这种jvzquC41yy}/zrfplkiikwf0eqs0uyjekcr0fnyckne66>5650nuou
1.钢筋工程最强266问答,从入门到精通!158、电梯的围护结构设计与普通楼梯有什么不同? 答:增设坚固的墙壁围护,以防止万一发生事故危及周围人员。 159、各式楼梯中,哪种楼梯最常用也最实用? 答:板式楼梯。 160、板式楼梯大致分为哪些种? 答:直板式、下折板式、上折板式、中平板式、旋转板式。 161、在平法中,k值是什么意思,有什么用处? 答:k值是一jvzquC41yy}/h€}iz0ipo8ftvkimg|4429;
2.护理知识1分钟问答护理天地17、热型分为哪几种? 答:热型分为四型:稽留热、间歇热、弛张热、不规则热。 18、稽留热:体温持续在39℃—40℃左右,达数日或数周,24小时波动范围不超过1.0℃。常见于大叶性肺炎、伤寒等。 19、弛张热:体温在39℃以上,但波动幅度大,24小时温差在1.0℃以上,最低温度仍高于正常水平。常见于败血症。 jvzquC41yy}/fƒistoz0ls1jwrj1?970jznn
3.一个产品的结构设计考虑哪几个问题?对于一个有经验的产品结构设计师来说,对每个产品进行结构设计时,都会习惯性地考虑一些问题,这些问题其实就是由基本的结构设计思维和规则来延伸出来的,考虑这些问题将会令产品结构设计更合理,更容易成功。 1、如何合理地选择材料? 2、最适合当前新产品的结构是哪种? jvzquC41yy}/lrfpuj{/exr1r17gdo:6:gh82n
4.62条全面的机械基础知识56、控制阀分哪几种?各有何作用? 控制阀分为方向阀、压力阀、流量阀;方向阀控制液压系统中油的流动方向。流量阀控制液压系统中油的流量大小。压力阀控制液压系统中油的压力大小。 56、换向阀接结构分有球阀式、滑阀式、转阀式。 57 、三位四通换向阀O、M、P、Y机能含义? jvzq<84yyy4kuvju0qxh1Qtog1VsgngyAoe?<68:(iicwsgnKj>3:+qtfksd‚nf?3
5.MySQL数据库理论知识24、SQL语句主要分为哪几类 数据定义语言DDL(Data Ddefinition Language)CREATE,DROP,ALTER 数据查询语言DQL(Data Query Language)SELECT 数据操纵语言DML(Data Manipulation Language)INSERT,UPDATE,DELETE 25、六种关联查询 交叉连接(CROSS JOIN) 内连接(INNER JOIN) jvzquC41dnuh0lxfp0tfv8}v3;?83:4ctvodnn4fgvgjn|4345>93;59
6.轻钢龙骨分哪几种类型?轻钢龙骨和木龙骨的区别轻钢龙骨分哪几种类型?轻钢龙骨和木龙骨的区别 [摘要]龙骨材料在装修吊顶中应用十分的普遍,而轻钢龙骨是为常用的龙骨材料,钢结构材料本身的特质让其具有防水、防尘、防震的优异特性,相较于木龙骨更加的坚固,故此成为如今家装建材的主要材料。 龙骨材料在装修吊顶中应用十分的普遍,而轻钢龙骨是为常用的龙骨材料,钢结构jvzquC41|jotjr3hcpm/exr1lkgkw8via3>96=90jvsm
7.OBCP题目及解析14.转储有哪几种方式? A、轮转 B、自动 C、定时 D、手动 【答案】BD 【解析】转储支持自动触发和手动触发两种方式。 合并也分自动触发和手动触发两种。 合并的自动触发有以下两个触发条件: 当一个租户的MEMTable的内存使用达到了freeze_trigger_percentage设置的阈值,且转储次数已达到了minor_freeze_times设置的上jvzquC41fg|fnxugt0gmk‚zp0eun1jwvkerf1:85;671
8.值得收藏的史上最全的PHP面试题(让你面试效率更高)php教程PHP的运行环境最优搭配为Apache+MySQL+PHP,此运行环境可以在不同操作系统(例如windows、Linux等)上配置,不受操作系统的限制,所以叫跨平台 2、WEB开发中数据提交方式有几种?有什么区别?百度使用哪种方式? Get与post两种方式 区别: (1)url可见性:get 方式url参数可见,post 不可见 jvzquC41yy}/rqu0ep5qjy2ygk€jlrfqejkoi69996;50qyon
9.100道Java基础面试题收集整理(附答案)java面试题10021.程序的结构有那些? 顺序结构 选择结构 循环结构 22.数组实例化有几种方式? 静态实例化:创建数组的时候已经指定数组中的元素, 动态实例化:实例化数组的时候,只指定了数组程度,数组中所有元素都是数组类型的默认值 23.Java中各种数据默认值 Byte,short,int,long默认是都是0 jvzquC41dnuh0lxfp0tfv8|gd3>5:=;485931jwvkerf1mjvckrt1:7853=19<