ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Mysql存储结构以及部分引擎

2021-11-27 10:33:02  阅读:73  来源: 互联网

标签:存储 结点 叶子 索引 引擎 搜索 Mysql 节点 查找


一、MySQL存储结构

  1. B-树和B+树

 B-树:(这里引用别的大佬的结构图)

B 树

 

 形如此类树型结构我们可以称之为B-树

B-树的特点:

  1. 所有键值分布在整颗树中(索引值和具体data都在每个节点里);
  2. 任何一个关键字出现且只出现在一个结点中;
  3. 搜索有可能在非叶子结点结束(最好情况O(1)就能找到数据);
  4. 在关键字全集内做一次查找,性能逼近二分查找;

 同时我们不难看出,父节点(我们这里可以把它理解为一整层)中每个节点的左子树(子层的左孩子)中的每个节点值均要小于该节点的值,而右半部分的值均大于该节点的值(有点类似于二叉搜索树),这样做最大的好处就是提高搜索性能。

MySQL中的B树还有一大特点就是普通的一个节点中可以存放许多节点(值),这样做减少了二叉搜索树层数过高的问题,减少从磁盘的读取次数,同时每次可以将一层中一大块节点加载到内存中,同时根据条件判断下一块加载到内存中的数据块,提高搜索效率

B+树:

B+树 1

 B+树和B-树最大的区别在于,每个叶子结点相互之间均是相连的,这样做更可以提高搜索效率。同时,B+树中所有节点的值均位于叶子节点上,也就是说,当我们需要检索某值是,均可从叶子节点处获取。

B+树特点:

1、非叶子节点不存储data,只存储索引(冗余),可以放更多的索引

2、叶子结点包含所有的字段值

3、叶子结点用指针相连,提高区间的访问性能

总结:

终上所述,B+树无疑具有更好的搜索性能,所以MySQL基本采用的都是B+树作为底层存储数据的结构,那B+树与我们的搜索引擎有什么联系呢?

二、MySQL引擎

  1. MyISAM

第一种要介绍的是MyISAM引擎,它是非聚集的。

我们都知道 ,MySQL采取的是索引取值的方法,也就是依靠提供的索引,去搜索获取我们想要得到的值。非聚集存储就是将索引值和data分别储存在两个文件中,当我们查找某个数据时,我们会在一个文件(MYI,该文件底层存储数据结构为B+树)中根据用户所提供的条件查找到该条件所对应的索引值,然后通过该索引值从data文件(MYD)中找到对应的数据。

(手绘了)

(大概就是这个样子吧)

这样的搜索无疑是效率较低的,因为我们每次搜索都需要两次从磁盘中读取文件(IO成本是很高的)。

      2.InnoDB

现在大部分MySQL采用的都是In弄DB引擎,该引擎会具有更高的搜索效率和搜索速度。

InnoDB与MyISAM最大的不同就是他会采取聚合存储的策略,也就是说将data和索引放在同一文件当中。

InnoDB底层依旧是采用B+树,同时叶子节点记录了完整的数据记录。

(依旧手绘)

这样我们在找到索引的同时也找到了相应的数据。

InnoDB在存储时建议我们采用设置int自增类型的主键,假设我们不设置主键,引擎会自动帮我们创建int型主键列用于查找

原因:

1、采用int类型的目的是为了减少内存的开销,提高内存使用率

2、设置主键的目的是为了更加快速的查找以及支持快速范围查找(MyISAM不支持),B+ 树的特点如我们所知,叶子结点部分从左往右方向节点值逐渐增大 ,同时节点之间相互连接,也就是说,当我们执行范围查找时,我们仅需要找到范围的边界节点所在位置,向左或向右遍历叶子结点即可,极大提高了搜索效率。

3、自增的原因是防止新曾节点后B+树的开裂。假设当我们的新增节点小于某个叶子节点时,B+树为了维持所支持的特性,会选择从该节点处向下延伸(开拓新的子节点),无疑降低了增添以及搜索的效率,而采用自增的主键值可以保证每次新增节点时,新增的节点必须在叶子结点的右方,降低了增加数据的消耗。

 

 

标签:存储,结点,叶子,索引,引擎,搜索,Mysql,节点,查找
来源: https://blog.csdn.net/m0_53127809/article/details/121572611

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有