为什么用B+树做索引&MySQL存储引擎简介

索引的数据结构

为什么不是二叉树,红黑树什么的呢?

首先,一般来说,索引本身也很大,不可能全部存在内存中,因此索引往往以索引文件的方式存在磁盘上。然后一般一个结点一个磁盘块,也就是读一个结点要进行一次IO操作。

而二叉树啊这些树类的数据结构,查找时间主要和树的高度有关,所以虽然一颗AVL树或者是红黑树在查找上比起顺序遍历的O(N)有了比较大的改善,但B树和B+树因为每个结点存的元素更多,所以查询更快,对磁盘的IO操作也更少。

 

 

为什么是B+树而不是B树呢?

1. 单一节点存储更多的元素(这样该节点下分支变多了,树变矮胖了),使得查询的IO次数更少。

B+树真正的数据都存在叶子结点嘛,也就是上面的结点就简单的索引,就内存会更小,意味着同样的一个页内存大小,所以B+树中,同样的磁盘页大小可以装更多个“索引”,也就是在同样的数据量的情况下,B+树会比B树更加矮胖,因此查询时IO的次数也更加少。

 

2. 所有查询都要查找到叶子节点,查询性能稳定。

B+树的查询必须查到叶子结点,因为它真正的数据都在叶子嘛,而B树不是,B树只要匹配到那个索引data就好,无论它是在中间结点还是叶子结点,因此B树的查询不是稳定的,最好的情况是只找根节点就行,最坏的情况是找到叶子结点,而B+树的每次查找都是稳定的。

 

3. 所有叶子节点形成有序链表,便于范围查询。

B树的范围查询十分麻烦,B+树的范围查询只需要在最下面的叶子结点的链表中做遍历就行。

 

 

 

关于MySQL存储引擎的简单介绍(全都复制粘贴的)

存储引擎?

定义:

数据库引擎是用于存储、处理和保护数据的核心服务。利用数据库引擎可控制访问权限并快速处理事务,从而满足企业内大多数需要处理大量数据的应用程序的要求。 使用数据库引擎创建用于联机事务处理或联机分析处理数据的关系数据库。这包括创建用于存储数据的表和用于查看、管理和保护数据安全的数据库对象(如索引、视图和存储过程)。


存储引擎作用:

1)设计并创建数据库以保存系统所需的关系或XML文档。

2)实现系统以访问和更改数据库中存储的数据。包括实现网站或使用数据的应用程序,还包括生成使用SQL Server工具和实用工具以使用数据的过程。

3)为单位或客户部署实现的系统。

4)提供日常管理支持以优化数据库的性能。

 

 

 

Innodb和MyIASM

1.简单介绍这两种引擎,以及该如何去选择。
2.这两种引擎所使用的数据结构是什么。

1.怎么选择

a.Innodb引擎,Innodb引擎提供了对数据库ACID事务的支持。并且还提供了行级锁和外键的约束。它的设计的目标就是处理大数据容量的数据库系统。它本身实际上是基于Mysql后台的完整的系统。Mysql运行的时候,Innodb会在内存中建立缓冲池,用于缓冲数据和索引。但是,该引擎是不支持全文搜索的。同时,启动也比较的慢,它是不会保存表的行数的。当进行Select count(*) from table指令的时候,需要进行扫描全表。所以当需要使用数据库的事务时,该引擎就是首选。由于锁的粒度小,写操作是不会锁定全表的。所以在并发度较高的场景下使用会提升效率的。

b.MyIASM引擎,它是MySql的默认引擎,但不提供事务的支持,也不支持行级锁和外键。因此当执行Insert插入和Update更新语句时,即执行写操作的时候需要锁定这个表。所以会导致效率会降低。不过和Innodb不同的是,MyIASM引擎是保存了表的行数,于是当进行Select count(*) from table语句时,可以直接的读取已经保存的值而不需要进行扫描全表。所以,如果表的读操作远远多于写操作时,并且不需要事务的支持的。可以将MyIASM作为数据库引擎的首先。

  补充2点:

  c.大容量的数据集时趋向于选择Innodb。因为它支持事务处理和故障的恢复。Innodb可以利用数据日志来进行数据的恢复。主键的查询在Innodb也是比较快的。

  d.大批量的插入语句时(这里是INSERT语句)在MyIASM引擎中执行的比较的快,但是UPDATE语句在Innodb下执行的会比较的快,尤其是在并发量大的时候。

 

2.两种引擎所使用的索引的数据结构是什么?

答案:都是B+树!

MyIASM引擎,B+树的数据结构中存储的内容实际上是实际数据的地址值。也就是说它的索引和实际数据是分开的,只不过使用索引指向了实际数据。这种索引的模式被称为非聚集索引。

Innodb引擎的索引的数据结构也是B+树,只不过数据结构中存储的都是实际的数据,这种索引有被称为聚集索引。

下面的内容再详细地介绍下这两种引擎中的索引机制

 

 

聚簇索引和非聚簇索引

先是InnoDB下的索引机制。

1. Innodb中的聚簇索引

在InnoDb中,用的就是聚簇索引,而且会默认为主键设置聚簇索引 ,Innodb通过主键聚集数据,如果没有定义主键,innodb会选择非空的唯一索引代替。如果没有这样的索引,innodb会隐式的定义一个主键来作为聚簇索引。

所谓聚簇索引,就是索引的逻辑顺序和数据的物理顺序是一致的,就像字典,你想找“怕”字,你会直接翻到字母“p”的位置开始找。innodb中的主键索引也就是主索引就是这样的机制,它的数据就在主索引的B+树的叶子节点 上:

 

聚簇索引的优点:

  1. 聚簇索引将索引和数据行保存在同一个B-Tree中,查询通过聚簇索引可以直接获取数据,相比非聚簇索引需要第二次查询(非覆盖索引的情况下)效率要高。
  2. 聚簇索引对于范围查询的效率很高,因为其数据是按照大小排列的

聚簇索引的缺点:

  1. 聚簇索引的更新代价比较高,如果更新了行的聚簇索引列,就需要将数据移动到相应的位置。这可能因为要插入的页已满而导致“页分裂”。
  2. 插入速度严重依赖于插入顺序,按照主键进行插入的速度是加载数据到Innodb中的最快方式。如果不是按照主键插入,最好在加载完成后使用OPTIMIZE TABLE命令重新组织一下表。
  3. 聚簇索引在插入新行和更新主键时,可能导致“页分裂”问题。
  4. 聚簇索引可能导致全表扫描速度变慢,因为可能需要加载物理上相隔较远的页到内存中(需要耗时的磁盘寻道操作)。

 

2. Innodb中的辅助索引

这里的辅助索引指的是不是建立在主键,或者说是聚簇索引的所在列的索引。这些索引的B+树中的叶子节点存的是该属性所对应的row的主键值。然后再通过这个主键值去主键索引的B+树中去找那个row。所以有时候也叫二次索引,就是建立在主聚簇索引上的索引,要二次搜索。

 

 

MyISAM下的索引机制

而在MyISAM中,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址!!

所以在MyISAM中,主索引和所谓是辅助索引,是一样的。

1. 主键索引:

MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。下图是MyISAM主键索引的原理图:

 

这里设表一共有三列,假设我们以Col1为主键,图myisam1是一个MyISAM表的主索引(Primary key)示意。可以看出MyISAM的索引文件仅仅保存数据记录的地址。

 

2. 辅助索引(Secondary key):

在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。如果我们在Col2上建立一个辅助索引,则此索引的结构如下图所示:

同样也是一颗B+Tree,data域保存数据记录的地址。因此,MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。

 

 

 

 

用一张图总结下这两个引擎中的索引机制:

 

 

参考文章:

https://blog.csdn.net/qq_35571554/article/details/82759668——《漫画叙述B+树和B-树,很值得看!》分析为什么是B+而不是B树,生动形象

https://www.cnblogs.com/sunsky303/p/8274586.html——《mysql各种引擎对比、实战 》这篇文章介绍了存储引擎的概念

https://www.cnblogs.com/xiaohaillong/p/6079551.html——《mysql的常用引擎 》,分析Innodb和MyIASM两个引擎

https://blog.csdn.net/lm1060891265/article/details/81482136——《聚簇索引和非聚簇索引》内容是蛮齐全的,就是写得很乱……

 

posted @ 2019-03-12 20:49  汪神  阅读(583)  评论(0编辑  收藏  举报