深入理解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.MySQL索引与页结构页结构图 图示说明: 1111a,分别表示col1,col2,col3,col4,col5 五列数据。红色标记为以主键构造的主键索引,也为聚簇索引。 用户数据区:数据为链表结构,对于链表结构而言,插入性能较高,而查询性较低,因此这个链表的长度不会很长,那么mysql是怎么解决这个问题的呢?当然是通过页目录来解决。 jvzquC41dnuh0lxfp0tfv8|gkzooa=95::<9;8ftvkimg8igvcomu86487=54:8
1.国内超大索穹顶张拉完成,坚朗自主研发智慧索首次应用特别是,光纤光栅智慧索凭借监测精度高、量程大、耐久性好、抗电磁干扰、信号容量大和损耗小的优点,首次被成功应用于三个场馆中,开启国内索结构体系健康监测的新纪元。 坚朗五金自2018年项目设计之初,便积极参与建筑方案选型、结构参数设计、张拉施工模拟分析、节点深化设计等全链条工程配合,并持续加大自主研发力度,开发出jvzquC41fyixd7hqo1tfy|nphq537=57494ivvq
2.珠江科学大讲堂第121讲:中国天眼与南仁东的故事如何建设?柔性网索结构实现反射面变位 姚蕊还介绍说,在20世纪90年代,中国已有的射电望远镜最大直径仅有25米,而美国的Arecibo射电望远镜经过扩建后直径达到了350米。而直径越大,射电望远镜的灵敏度则越高,灵敏度直接决定了能“看到”多暗的信号。因此,如果我们想看到别人看不到的信号,就要建直径更大的射电望远镜。jvzquC41pg}t0‚hyd0ipo872463168761euovnsva7876<6970nuo
3.岗位上的坚守!“五一”施工不打烊他们坚守在一线抢工期荆楚网五一期间,由中建八局东北公司承建的大连梭鱼湾足球场项目仍是机械轰鸣、一派繁忙景象。目前,项目建设者们经过177天努力施工,在昨天上环索提升、撑杆安装、拉索提升、交叉索施工的目标如期完成。 中建八局东北公司大连梭鱼湾专业足球场项目经理 么德生:今天我们完工的是体育场屋面罩棚索结构体系,是本工程最为重要的分项jvzq<84pgyy/ewmwdgo/exr1eqtugwy14283/9:1245dqwygpve26@6742;/j}rn
4.索引的原理·数据库·看云索引是一种利用某种规则的数据结构与实际数据的关系加快数据查找的功能;索引数据节点中有着实际文件的位置,因为索引是根据特定的规则和算法构建的,在查找的时候遵循索引的规则可以快速查找到对应数据的节点,从而达到快速查找数据的效果;其实宏观来说索引其实是一种概念而不是具体的某项技术,只是我们在某个技术中运用得比jvzquC41yy}/mjsenq{e0ls1htkzc9531fguckfug182:B<66
5.土木工程学院主要从事大型复杂土木工程结构分析和施工技术的教学和科研工作,致力于大跨空间预应力索结构的分析、设计、施工和测试技术及工程应用的研究,主持和参与的科研项目有:科技部“应用于FAST反射面闭环控制的实时仿真系统”、“基于塔架提升索杆累积安装的索穹顶施工关键力学分析和技术研究”和“基于向量式有限元的预应力空间结构jvzquC41ek|jn7xgw0kew7hp1nh0nrxv0jzn
6.LiuHongbo本科生课程《通用结构分析软件》 本科生课程《现代预应力结构》 研究生课程《大跨度建筑结构体系》 主要学术兼职: 1) 中国钢结构协会 理事 2) 中国建筑金属结构协会铝结构分会 秘书长 3) 中国钢结构协会结构稳定与疲劳分会 理事 4) 中国钢结构协会空间结构分会索结构专业委员会 委员 jvzq<84liz/vsz0gf{/ew4kphu03:9;14=777mvo
7.《MySQL高级篇》四索引的存储结构mysql索引存储结构《MySQL高级篇》四、索引的存储结构 本文详细解析了数据库索引的原理,包括B+树的构建与优化,聚簇索引与非聚簇索引的区别,以及MyISAM和InnoDB存储引擎的索引实现。讨论了索引的优缺点,指出索引在提高查询效率的同时,也会增加存储空间和维护成本。此外,还提到了哈希索引和R树等不同类型的索引结构及其适用场景。最后,强调了合理选择数 jvzquC41dnuh0lxfp0tfv8fufhgecoi1ctzjeuj1fgzbkux134<16;>23
8.sql索引的介绍以及使用规则详析Mysql3。如果表没有主键,或没有合适的唯一索引,则 InnoDB 会自动生成一个 rowid 作为隐藏的聚集索 引。 聚集索引和二级索引的具体结构如下图所示。 聚集索引的叶子节点下挂的是这一行的数据 , 二级索引的叶子节点下挂的是该字段值对应的主键值。 执 行如下的 SQL语句时,具体的查找过程如下所示。 具体过程如下: 1jvzquC41yy}/lk:30pku1jwvkerf1;<;;6:/j}r