MySql索引底层

   好久没有写博客了,前几天看了一个关于索引底层原理的学习视频,虽然是技术小白,但也是整理下自己学到或者理解的一些知识吧,不喜勿喷,欢迎交流!

MySql索引的底层原理
1.索引的定义
MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。
2.索引的分类
常见的索引类型有:主键索引、唯一索引、普通索引、全文索引、组合索引
1、主键索引:即主索引,根据主键pk_clolum(length)建立索引,不允许重复,不允许空值;
2、唯一索引:用来建立索引的列的值必须是唯一的,允许空值
3、普通索引:用表中的普通列构建的索引,没有任何限制
4、全文索引:用大文本对象的列构建的索引
5、组合索引:用多个列组合构建的索引,这多个列中的值不允许有空值
*遵循“最左前缀”原则,把最常用作为检索或排序的列放在最左,依次递减,组合索引相当于建立了col1,col1col2,col1col2col3三个索引,而col2或者col3是不能使用索引的。
*在使用组合索引的时候可能因为列名长度过长而导致索引的key太大,导致效率降低,在允许的情况下,可以只取col1和col2的前几个字符作为索引
3.索引的优缺点
**优势:**可以快速检索,减少I/O次数,加快检索速度;根据索引分组和排序,可以加快分组和排序;
**劣势:**索引本身也是表,因此会占用存储空间,一般来说,索引表占用的空间的数据表的1.5倍;索引表的维护和创建需要时间成本,这个成本随着数据量增大而增大;构建索引会降低数据表的修改操作(删除,添加,修改)的效率,因为在修改数据表的同时还需要修改索引表;
4.索引的实现原理
我们知道,数据库查询是数据库的最主要功能之一。我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化。如果稍微分析一下会发现,每种查找算法都只能应用于特定的数据结构之上,所以,在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。
在这里插入图片描述
这是正常的一张表,假设我们需要查询col2=23这条数据,
select * from table where col2=23;
当我们没有建任何索引的时候,数据库会从第一条开始依次查询,基于最基本的查询算法:顺序查找(linear search),然后足足经过7次查询,才找到我们需要的数据.,这样的情况就是当数据量一大,会导致我们的数据查询会非常的慢。
这时候,索引就能帮助我们加快提高查询的效率了。
计算机科学的发展提供了很多更优秀的查找算法,例如二叉树查询算法,B树查询算法,B+树查询算法,索引就是通过指向这些优秀的算法然后实现效率的提高。
二叉树:
这就是二叉树一种大概的结构:(左边<右边,根节点>子节点)
在这里插入图片描述
我们将col2设为索引,同样我们取col2=23这条数据,当数据库查询完第一条数据时,会将34与第一条数据的34比较,如果是小,就从左边走,如果是大,就走右边,然后查到第二条数据再次比较,直到查询到col2=23这条数据,这样只需要经过3次的查询之后就能找到所需要的数据了,跟之前的7次提高了很大的效率。但如果是极端的情况,设col1为索引,查询col1=7的数据,那怕是使用二叉树查询算法,也是没有任何的效率提升,需要足足查询7次。(同样这样的提升也是可见的,一旦数据量一大,到百万,千万级数据量的时候,也是会非常的缓慢)
B树
这是一种更效率的数据结构算法,上面的二叉树图,每个子节点就放一个数据,B树就是在这个基础上,我每个子节点不在只放一个数据,而是放多个数据,这样查询的次数就会再次缩减,达到优化查询的目的
在这里插入图片描述
那很多人会产生两个疑问:
1.一个节点我放多个数据,那我干脆所有的数据都放在一个节点内,那是不是代表我只要查一次就直接查出来了?
答:每个节点的是有大小的,无法所有的数据都放在一个节点里面。
2.一个节点放两个数据,是不是代表也需要查询两次?那效率还是没有提升。
答:mysql的数据查询是对于磁盘上的数据进行查询,而节点上的查询,是在内存上进行的查询,而内存上查询的效率是远远高于磁盘上查询的效率。
但B树查询算法也有一定的局限,假设我查询的数据时没有规则的几个,那我每次查询到一个数据之后,我还需要回到根节点,然后重新再从根节点再查询接下来的数据。
B+树(Mysql索引用到的底层数据结构)
在这里插入图片描述
B+树是对于B树的一种优化,同样是每个节点会有多个数据,在B+树的每个叶子节点增加一个指向相邻叶子节点的指针,就形成了带有顺序访问指针的B+Tree。做这个优化的目的是为了提高区间访问的性能,例如图中如果要查询从18到49的所有数据记录,当找到18后,只需顺着节点和指针顺序遍历就可以一次性访问到所有数据节点,极大提到了区间查询效率。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值