[聚集行]聚簇索引与非聚簇索引(JAVA后端面试知识点)

(题主今年研三,中国科学院某京区所处读,研一没升学期间就开始归纳自学数据资料,目前却是拿了很香的offer,自己归纳的讲义数据资料觉得却是很有象征意义的,不该浪费掉,所以想先高发些该文,假如有JAVA后端复试自学问题也能来朋友圈我)

注:这些科学知识都是我从很多地方归纳来,若侵权行为请联络我,我归纳的科学知识务求全面性,避免大家只懂一是,不知其二

归纳:InnoDB中,表统计CSV这类是按B+Tree组织机构的两个检索结构,聚簇检索是依照两张表的换行符外部结构两颗B+树,与此同时枝叶结点中放置的是整首表的行历史记录统计数据,也将涌进检索的枝叶结点称作统计数据页。那个优点下定决心了检索组织机构附注统计数据也是检索的一小部分;

一般建表会用两个自增换行符做聚簇检索,没有的话MySQL会预设建立,但是那个换行符假如更动付出较低,故建表时要考虑自增ID不能频密update这两点。

我们日常生活工作中,根据实际情况圣戈当县的检索都是远距检索,远距检索是两个为了Navarrenx换行符检索的三级检索,先找出换行符检索再通过换行符检索找统计数据;

聚簇检索并不是一类原则上的检索类别,而是一类统计数据储存形式。具体内容技术细节倚赖其实现形式。

MySQL统计资料库中innodb储存发动机,B+树检索能分为聚簇检索(也称涌进检索,clustered index)和远距检索(有时候也称非聚簇检索或三级检索,secondary index,non-clustered index)。这三种检索外部都是B+树,涌进检索的枝叶结点放置着一aes的统计数据。

Innobd中的换行符检索是一类聚簇检索,非聚簇检索都是远距检索,像A43EI235E检索、后缀检索、惟一检索。

Innodb采用的是聚簇检索,MyISam采用的亦然聚簇检索。

1) 聚簇检索(涌进检索)

聚簇检索是依照两张表的换行符外部结构两颗B+树,与此同时枝叶结点中放置的是整首表的行历史记录统计数据,也将涌进检索的枝叶结点称作统计数据页。那个优点下定决心了检索组织机构附注统计数据也是检索的一小部分,两张表只能保有两个聚簇检索。

Innodb通过换行符涌进统计数据,假如没有定义换行符,innodb会选择非空的惟一检索代替。假如没有这样的检索,innodb会隐式的定义两个换行符来作为聚簇检索。

2) 聚簇检索的优缺点

优点:

1.统计数据访问更快,因为聚簇检索将检索和统计数据保存在同两个B+树中,因此从聚簇检索中获取统计数据比非聚簇检索更快。

2.聚簇检索对于换行符的排序查找和范围查找速度非常快。

缺点:

1.插入速度严重倚赖插入顺序,依照换行符的顺序插入是最快的形式,否则将会出现页分裂,严重影响性能。因此,对于InnoDB表,我们一般都会定义两个自增的ID列为换行符。

2.更新换行符的付出很高,因为将会导致被更新的行移动。因此,对于InnoDB表,我们一般定义换行符为不可更新。

3.三级检索访问需要两次检索查找,第一次找出换行符值,第二次根据换行符值找出行统计数据。

3) 远距检索(非聚簇检索)

在聚簇检索之上建立的检索称之为远距检索,远距检索访问统计数据总是需要二次查找。远距检索枝叶结点储存的不再是行的物理位置,而是换行符值。通过远距检索首先找出的是换行符值,再通过换行符值找出统计数据行的统计数据页,再通过统计数据页中的Page Directory找出统计数据行。

Innodb远距检索的枝叶结点并不包含行历史记录的全部统计数据,枝叶结点除了包含键值外,还包含了相应行统计数据的聚簇检索键。

远距检索的存在不影响统计数据在聚簇检索中的组织机构,所以一张表能有多个远距检索。在innodb中有时候也称远距检索为三级检索。

4) InnoDB检索实现

InnoDB也采用B+Tree作为检索结构,但具体内容实现形式却与MyISAM截然不同。

1.换行符检索:

MyISAM检索文件和统计CSV是分离的,检索文件仅保存统计数据历史记录的地址。而在InnoDB中,表统计CSV这类是按B+Tree组织机构的两个检索结构,这棵树的叶结点data域保存了完整的统计数据历史记录。那个检索的key是统计数据表的换行符,因此InnoDB表统计CSV这类是主检索。

(图inndb换行符检索)是InnoDB主检索(与此同时也是统计CSV)的示意图,能看到叶结点包含了完整的统计数据历史记录。这种检索叫做涌进检索。因为InnoDB的统计CSV这类要按换行符涌进,所以InnoDB要求表必须有换行符(MyISAM能没有),假如没有显式指定,则MySQL系统会自动选择两个能惟一标识统计数据历史记录的列作为换行符,假如不存在这种列,则MySQL自动为InnoDB表生成两个隐含字段作为换行符,那个字段长度为6个字节,类别为长整形。

2.InnoDB的远距检索

InnoDB的所有远距检索都引用换行符作为data域。例如,下图为定义在Col3上的两个远距检索:

InnoDB 表是基于聚簇检索建立的。因此InnoDB 的检索能提供一类非常快速的换行符查找性能。不过,它的远距检索(Secondary Index, 也亦然换行符检索)也会包含换行符列,所以,假如换行符定义的比较大,其他检索也将很大。假如想在表上定义 、很多检索,则争取尽量把换行符定义得小一些。InnoDB 不会压缩检索。

涌进检索这种实现形式使得按换行符的搜索十分高效,但是远距检索搜索需要检索两遍检索:首先检索远距检索获得换行符,然后用换行符到主检索中检索获得历史记录。

同储存发动机的检索实现形式对于正确采用和优化检索都非常有帮助,例如知道了InnoDB的检索实现后,就很容易明白:

1、为什么不建议采用过长的字段作为换行符,因为所有远距检索都引用主检索,过长的主检索会令远距检索变得过大。

2、用非单调的字段作为换行符在InnoDB中不是个好主意,因为InnoDB统计CSV这类是两颗B+Tree,非单调的换行符会造成在插入新历史记录时统计CSV为了维持B+Tree的优点而频密的分裂调整,十分低效,而采用自增字段作为换行符则是两个很好的选择。

InnoDB采用的是聚簇检索,将换行符组织机构到一棵B+树中,而行统计数据就储存在枝叶结点上,若采用"where id=14"这样的条件查找换行符,则依照B+树的检索算法即可查找出对应的叶结点,之后获得行统计数据。若对Name列进行条件搜索,则需要两个步骤:第一步在远距检索B+树中检索Name,到达其枝叶结点获取对应的换行符。第二步采用换行符在主检索B+树种再执行一次B+树检索操作,最终到达枝叶结点即可获取aes统计数据。

5) MyISAM检索实现

MyISAM检索文件和统计CSV是分离的,检索文件仅保存统计数据历史记录的地址。

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域的值为地址,读取相应统计数据历史记录。

MyISAM的检索形式也叫做非涌进的,之所以这么称呼是为了与InnoDB的涌进检索区分。

MyISAM采用的亦然聚簇检索,非聚簇检索的两棵B+树看上去没什么不同,结点的结构完全一致只是储存的内容不同而已,换行符检索B+树的结点储存了换行符,远距键检索B+树储存了远距键。表统计数据储存在独立的地方,这两颗B+树的枝叶结点都采用两个地址指向真正的表统计数据,对于表统计数据来说,这两个键没有任何差别。由于检索树是独立的,通过远距键检索无需访问换行符的检索树。

为了更形象说明这三种检索的区别,我们假想两个表如下图储存了4行统计数据。其中Id作为主检索,Name作为远距检索。图示清晰的显示了聚簇检索和非聚簇检索的差异。

6) 问题:换行符检索是涌进检索却亦然涌进检索?

在Innodb下换行符检索是涌进检索,在Myisam下换行符检索亦然涌进检索

7) 聚簇检索和非聚簇检索的区别?

聚簇检索的枝叶结点放置的是换行符值和统计数据行,支持覆盖检索;三级检索的枝叶结点放置的是换行符值或指向统计数据行的指针。

由于节子结点(统计数据页)只能依照两颗B+树排序,故一张表只能有两个聚簇检索。远距检索的存在不影响聚簇检索中统计数据的组织机构,所以一张表能有多个远距检索。

注: 覆盖检索(covering index)指两个查询语句的执行只用从检索中就能够取得,不必从统计数据附注读取。也能称之为实现了检索覆盖。 当一条查询语句符合覆盖检索条件时,MySQL只需要通过检索就能返回查询所需要的统计数据,这样避免了查到检索后再返回表操作,减少I/O提高效率。 如,表covering_index_sample中有两个普通检索 idx_key1_key2(key1,key2)。当我们通过SQL语句:select key2 from covering_index_sample where key1=‘keytest’;的时候,就能通过覆盖检索查询,无需回表。

发布于 2022-09-23 19:09:29
收藏
分享
海报
118
上一篇:[聚集行]叠氮聚乙二醇硅N3 下一篇:[聚集行]聚集性
目录