说说mysql索引

一、mysql索引类型

1数据结构角度:(1)B+树索引(2)hash索引(3)fulltext索引(4)R-tree索引

2物理角度:(1)聚集索引(2)非聚集索引

3逻辑角度:(1)主键索引(2)普通索引或单列索引(3)多列索引(4)唯一索引(5)空间索引

二、B树

1、B树的定义

        B树是一种多路平衡查找树。描述一棵B树时要指定他的阶数,阶数表示了一个结点最多有多少个孩子结点。一般用m表示阶数,当m=2时B树就是常见的二叉搜索树。

一棵m阶B树的定义如下:

1)每个结点最多有m-1个关键字。

2)根结点最少可以有1个关键字

3)非根结点至少有Math.cel(m/2)-1个关键字。

4)每个结点中的关键字都是按从小到大排列,每个关键字的左子树中的所有关键字都小于它,而右子树中的所有关键字都大于它。

5)所有的叶子结点都位于同一层,或者说根节点到每个叶子结点的路径长度都相同。

2、B树的插入操作

        插入操作是指插入一条记录,即(key,value)键值对。如果B树中已存在需要插入的键值对,则用新value替换旧value.若B树不存在这个key,则在叶子结点中进行插入操作。插入步骤:

1)根据要插入的key值,找到叶子结点并插入

2)判断当前结点key的个数是否小于等于m-1,若满足则结束,否则进行第三步

3)以结点的中间key为中心分裂成左右两部分,然后将这个中间key插入到父结点中。这个key的左子树指向分裂后的左半部分,右子树指向分裂后的右半部分。然后将当前结点指向父结点,继续进行第三步操作。

举例:向5阶B树中插入 a-h英文字母

1)将 a b c d 插入一棵空的B树中。

【a,b,c,d】

2)插入字母e,判断该结点的key数目大于m-1,进行分裂,选取结点中间位置的key插入父节点,其余key分裂为左右子树。

【a,b,c,d,e】----->                        【c】

【a,b】【d,e】

3)插入字母f g到右子树

【c】

                                               【a,b】【d,e,f,g】

4)插入h,判断右子树叶子结点key数目大于m-1,进行分裂,选取结点中间位置的key:f插入父节点,其余key再次分裂。

【c】                                                                【c,f】

【a,b】【d,e,f,g,h】--------------------------->   【a,b】【d,e】【,g,h】

3、B树的删除操作

1)如果要删除的key在叶子结点则直接删除

2)如果删除后的叶子结点key数量小于Math.ceil(m/2)-1,;则选取一个兄弟结点与对应的父节点合并并重新分裂出两个兄弟结点。

3)如果要删除的key不是叶子结点,则用要删除key的后继key代替它然后删除它的后继,直到最后删除的key位于叶子结点。然后重复1、2步骤。

三、B+树

 B+树属于B树的变种,与B树相比B+树有以下不同点

1)非叶子结点的子树指针与关键字个数相同

2)非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树(B-树是开区间);

3)为所有叶子结点增加一个链指针;    

4)所有关键字都在叶子结点出现;

5)内节点不存储value,只存储key

B+树的特性    

1.所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的;

2.不可能在非叶子结点命中;

3.非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;

4.更适合文件索引系统;

四、mysql的两种存储引擎的索引存储机制      

(一)MyISAM索引实现     

MyISAM引擎使用B+Tree作为索引结构,叶节点的value域存放的是数据记录的地址。  因此,MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其 value  域的值,然后以 value  域的值为地址,读取相应数据记录。MyISAM的索引方式也叫做“非聚集”的。

(二)InnoDB索引实现

        虽然InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同。

1、InnoDB的数据文件本身就是索引文件。从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点 value  域保存了完整的数据记录。这种索引叫做聚集索引。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。

2、与MyISAM索引的不同是InnoDB的辅助索引 value  域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为 value  域。聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。

五、最左前缀原则

        mysql数据库中联合索引(对表中几个列建立的索引),当b+树的数据项是复合的数据结构,比如(name,age,sex)的时候,b+数是按照从左到右的顺序来建立搜索树的,比如当(张三,20,F)这样的数据来检索的时候,b+树会优先比较name来确定下一步的所搜方向,如果name相同再依次比较age和sex,最后得到检索的数据;但当(20,F)这样的没有name的数据来的时候,b+树就不知道下一步该查哪个节点,因为建立搜索树的时候name就是第一个比较因子,必须要先根据name来搜索才能知道下一步去哪里查询。比如当(张三,F)这样的数据来检索时,b+树可以用name来指定搜索方向,但下一个字段age的缺失,所以只能把名字等于张三的数据都找到,然后再匹配性别是F的数据了, 这个是非常重要的性质,即索引的最左匹配特性。

六、总结

        对于innoDB引擎来说,采用的是B+树聚集索引。并且目前的innoDB引擎不允许自定义hash索引。

不建议用过长的字段作为主键,因为所有的辅助索引都引用主索引,会导致辅助索引变得过大。另外尽量使用单调的字段作为主键索引,自增字段是一个很好的选择。

引用:https://www.jianshu.com/p/1775b4ff123a

你可能感兴趣的:(说说mysql索引)