Mysql存储结构以及部分引擎

2021/11/27 19:13:02

本文主要是介绍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存储结构以及部分引擎的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程