MySql索引的数据结构

mysql索引是什么?

想象一下,你手上有一本数学教材,但是目录被别人给撕掉了,现在要你翻到三三角函数的那一页,该怎么办?

没有了目录,就只有两种方法,要么一页一页翻,要么随机翻。

如果数据表没有目录的话,那要查询满足条件的记录行,就需要进行全表扫描,现在的互联网应用,数据量都非常大,百万千万都很常见,这要是全表扫描,那可就恼火了,所以为了加快查询的速度,得给数据表也设置目录,这个为数据表设计的目录就是索引。

MySql采用B+数作为数据结构的原因

二叉树------>平衡二叉树------>B树------>B+树

想要实现查询,最简单的办法就是二分法查找,比如要根据ID来查找,就可以根据ID字段来构建一棵二叉树,顺着二叉树就可以找到要查询的内容,但是普通的二叉树存在一个问题,就是随着新的数据节点不断地插入,很有可能造成树的不平衡,极端的情况之下甚至会变成一个链表,这就非常不利于数据的查询

为了防止上述情况的出现,可以将二叉树升级一下变成一个平衡二叉树,这样就避免了不平衡的情况,但是随着数据量越来越大,这棵平衡二叉树的高度就会变得非常深,每层的节点数被锁定位上层节点的二倍,以此类推,即便是存1000条数据,二叉树就会变成10层,查找数据就需要多次分叉,每一次分叉都需要读取一次硬盘的数据,这样一来,一次查询就需要进行好多次的IO操作,而读取硬盘的数据,相对于内存是非常慢的。

后来,B树的使用使得书的深度问题得到了解决。在B树中,一个节点可以有多个数据,并且他们按顺序排列起来,此外原来二叉树的节点最多只能分开两个叉,现在可以开非常多的分叉,查找的时候还是先从根节点触发,因为节点里的所有数据都是有序排列的,在节点中试用二分法就可以快速的定位到,如果没有查到,就根据数据节点所在的区间,去往下一级分叉的节点,重复查找的过程,由于可以有很多的分叉,所以这棵B树变得非常扁平化,即使是非常大的数据量,也只需要很少几次IO访问就能完成查找。

【有很多的数据库都采用了B树作为数据存储的和索引的数据结构】

但是B树还是存在一些问题,比如 他的查询效率不太稳定,有些在根节点或者根节点附近就能找到,那么他的查询效率就很快,如果距离根节点的距离比较远,那么查询的效率就比较慢了,所以性能不是很稳定。

另外,B树也不适合用来做范围查找,因为数据散落在不同的节点上,要查询某个范围的数据,就需要在B树上不用层级节点间进进出出,效率也会随之降低。

【MySql的索引采用B+树的数据结构】

所以就MySql就采用了B+树作为索引的结构。

B+树将数据全部都放在了叶子节点上,这样一来不管要查询哪个数据,最终都要走到叶子节点上,解决了查询性能不稳定的问题,其次,上面这些节点不用来存储数据了,省下来的空间用来存储指向其他节点的指针,这样一来,中间的节点中可以分出的叉就变得更多了,整个书变得更加的扁平,进一步减少IO查询的次数,最后再将叶子节点之间用指针连接起来,这样一来,就能解决范围查询的问题了。

在一些其他的场景中,还可以使用哈希索引来设计。

相关推荐
StackNoOverflow5 小时前
Spring Security权限控制框架详解
java·数据库·sql
不愿透露姓名的大鹏5 小时前
Oracle归档日志爆满急救指南
linux·数据库·oracle·dba
a里啊里啊5 小时前
Redis面试题记录
数据库·redis·缓存
数据知道5 小时前
claw-code 源码分析:OmX `$team` / `$ralph`——把 AI 辅助开发从偶发灵感变成可重复流水线
数据库·人工智能·mysql·ai·claude code·claw code
__土块__5 小时前
大厂后端一面模拟:从线程安全到分布式缓存的连环追问
jvm·redis·mysql·spring·java面试·concurrenthashmap·大厂后端
麦聪聊数据5 小时前
企业数据流通与敏捷API交付实战(六):内部API门户与自助分发机制
数据库·低代码·restful·etl
做个文艺程序员6 小时前
深入 MySQL 内核:MVCC、Buffer Pool 与高并发场景下的极限调优
数据库·mysql·adb
杰克尼6 小时前
redis(day03-优惠券秒杀)
数据库·redis·缓存
七夜zippoe6 小时前
DolphinDB入门:时序数据库的正确打开方式
数据库·struts·时序数据库·工业互联网·dolphindb
数厘6 小时前
2.4MySQL安装配置指南(电商数据分析专用)
数据库·mysql·数据分析