petite妮妮崽
[toc]
在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,本文主要讨论是MyISAM和InnoDB两个存储引擎的B+Tree索引的实现方式。
MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址,下面是MyISAM索引的原理图:
上图是一个MyISAM表的主索引示意,可以看出MyISAM的索引文件仅仅保存数据记录的地址,在MyIASM中,主索引和辅助索引在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。B+Tree的所有叶子节点包含所有关键字且按照升序排列的。
MyISAM表的索引和数据是分离的,索引保存在“表名.MYI”文件内,而数据保存在“表名.MYD”中。
MyISAM的索引方式也叫做 非聚集 的,之所以这么称呼是为了与InnoDB的聚集索引区分。
虽然InnoDB也使用B+Tree作为索引结构,但是具体实现方式却与MyISAM截然不同。
第一个重大区别是InnoDB的数据文件本身就是索引文件,从上文知道MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录地址,而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录,这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。
上图是InnoDB主索引(同时也是数据文件)的示意图,可以看到叶节点包含了完整的数据记录。这种索引叫做 聚集索引 。因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显示指定,则MySQL系统会自动选择一个唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段为主键,这个字段长度为6字节,类型为长整形。
第二个与MyISAM索引的不同时InnoDB的辅助索引data域存储相应记录主键值而不是地址,换句话说,InnoDB的所有辅助索引都引用主键作为data域,例如,下图定义在col3上的辅助索引:
这里的英文字符的ASCII码作为比较准则。聚集索引这种方式使得按照主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键索引到主索引中检索获取记录。
了解不同存储引擎的索引实现对于正确使用和优化索引都非常有帮助,例如知道了InnoDB的索引实现后,就很容易明白不建议使用过长的字段作为主键, 因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变的更大 ,在例如, 用非单调的字段作为主键在InnoDB中不是个好主意,因为InnoDB数据文件本身是一颗B+Tree非单调的主键会造成在插入新纪录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,而使用自增字段作为主键则是一个很好的选择
ES的索引不是B+Tree树,而是倒排索引,ES的倒排索引由 Term index,Term Dictionary和Posting List 组成的。
有倒排索引(inverted index)就用正排索引(forward index),正排索引就是文档(Document)和他字段Fields正向对应的关系对应表如下:
那么倒排索引是字段Field和拥有这个Field的文档对应的关系如下:
Sex字段:
Age字段:
Jack、lucy或者17,18叫做term,而[1,3]就是Posting list。Posting list就是一个int数组,存储了所有包含某个term的文档id,那么什么是term index和term dictionary?
如上如果name字段很多个term,比如Carla,Sara,Elin,Ada,Patty,Kate,Selena,如果按照这样的顺序排列,找出某个特定的term一定很慢,因为term没有排序,需要全部过滤一遍,才能找出特定的term。排序之后就变成了:Ada,Carla,Elin,Kate,Patty,Sara,Selena。
这样就可以使用二分法的方式,比全遍历更快的找出目标的term,如果组织这些term的方式就是 term dictionary ,意思就是term的字典,有了term dictionary之后,就可以用比较少的比较次数和磁盘读次数查找目标。但是磁盘的随机读操作仍然是非常昂贵的,所以尽量少的读磁盘,有必要把一些数据缓存到内存里,但是整个Term dictionary本身又太大了,无法完整的放到内存中,于是就有了term index,Term index有点像一本字典的打的章节表。比如:
A开头的term ……………. Xxx页
C开头的term ……………. Xxx页
E开头的term ……………. Xxx页 如果所有的term都是英文字符的话,可能这个term index就真的是26个英文字符表构成了。但是实际情况是,term未必都是英文字符,term可以是任意的byte数组。而且26个英文字符未必是每一个字符都有均等的term,比如x字符开头的term可能一个都没有,而s开头的term又特别多,实际的term index是一颗字典树(trie 树):
上面例子是一个包含A", "to", "tea", "ted", "ten", "i", "in", 和 "inn" 的trie树。这棵树不会包含所有的term,他包含的是term的一些 前缀 ,通过term index可以快速定位到term dictionary的某个offest,然后从这个位置在往后顺序查找,再加上一些压缩技术,Term index的尺寸可以只有所有的term的尺寸的十分之一,用内存缓存整个term index变成可能,整体上来说就是这样的效果:
由Term index到Term Dictionary,再到posting list,通过某个字段的关键字去查询结果的过程比较清楚了,通过多个关键字的posting list进行and或者or进行交集并集的查询也简单了( 倒排索引介绍了交集并集的过程 )
对比MySQL的B+Tree索引原理,可以发现:
伯纳乌的蓝
这个区别应该由计算机专业的来回答,英语词典看再多也分不清的。我之前用中文版Word也不懂,后来用了英文版word一下子就明白了,因为中文版把title和heading都叫作“标题”,实际在计算机专业术语中,title比heading层级更高。
title可以指文档或网页的大标题,作为标识名称,不会显示在网页内容中,而是在浏览器窗口的标题栏或标签栏上,相当于书名,一般是出现在封面上,而不是正文段落中。除了title,还有副标题subtitle,当然subtitle也可指视频的字幕。
heading一般是指章节或段落的小标题,所以Word文档中会有标题1、标题2、标题3……这样的样式,是用来强调要点与控制内容的层次结构的,如果你切换到大纲视图,就会看到这些样式分别对应1级标题、2级标题、3级标题这样的目录结构。
可爱哆咪
26字母表大小写如下:
英文字母渊源于拉丁字母,拉丁字母渊源于希腊字母,而希腊字母则是由腓尼基字母演变而来的,腓尼基字母又深受古埃及圣书体文字影响。
古埃及新王国时期,腓尼基地区大部分时间是在埃及统治之下,腓尼基人深受埃及文化的影响。大约公元前13世纪,腓尼基人创造了人类历史上第一批字母文字,共22个字母(无元音)。这是腓尼基人对人类文化的伟大贡献。
部分字母介绍
1、哑音字母l
字母l在元音字母a或o之后且位于f,v,k,m诸辅字母之前时,l通常不发音,如: half 一半; talk 谈话; walk 步行。
2、哑音字母n
字母n位于m之后且在词尾时,n不发音。 常见的词有: autumn 秋天。
3、哑音字母p
英语中大部分以pn,ps,pt pb开头或结尾的单词大都源于希腊语中表示科学或文学的词语,在现代英语中,字母p 已不再发音: cupboard 碗柜。
参考资料来源:百度百科—英文字母
优质英语培训问答知识库