MySql索引的数据布局

打印 上一主题 下一主题

主题 555|帖子 555|积分 1665

mysql索引是什么?

想象一下,你手上有一本数学课本,但是目录被别人给撕掉了,如今要你翻到三三角函数的那一页,该怎么办?
没有了目录,就只有两种方法,要么一页一页翻,要么随机翻。
如果数据表没有目录的话,那要查询满足条件的记载行,就需要举行全表扫描,如今的互联网应用,数据量都非常大,百万万万都很常见,这要是全表扫描,那可就恼火了,所以为了加快查询的速率,得给数据表也设置目录,这个为数据表计划的目录就是索引。
MySql采用B+数作为数据布局的原因

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

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

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

但是B树还是存在一些问题,比如 他的查询效率不太稳固,有些在根节点或者根节点附近就能找到,那么他的查询效率就很快,如果距离根节点的距离比较远,那么查询的效率就比较慢了,所以性能不是很稳固。
别的,B树也不得当用来做范围查找,由于数据散落在不同的节点上,要查询某个范围的数据,就需要在B树上不消层级节点间进进出出,效率也会随之降低。
【MySql的索引采用B+树的数据布局】
所以就MySql就采用了B+树作为索引的布局。
B+树将数据全部都放在了叶子节点上,这样一来不管要查询哪个数据,最终都要走到叶子节点上,解决了查询性能不稳固的问题,其次,上面这些节点不消来存储数据了,省下来的空间用来存储指向其他节点的指针,这样一来,中间的节点中可以分出的叉就变得更多了,整个书变得更加的扁平,进一步减少IO查询的次数,最后再将叶子节点之间用指针毗连起来,这样一来,就能解决范围查询的问题了。
在一些其他的场景中,还可以利用哈希索引来计划。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

尚未崩坏

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表