索引
索引在MySQL中是举足轻重的。在添加索引后,我们在MySQL的查询上会极大的提高我们的查询效率,这也是慢查询解决办法之一。
数据结构
最初的时候MySQL中是采用二叉树进行插入数据的,这样的缺点很明显,就是树太高了,就如下图所示,我们需要查询5这个数据时,至少是需要比较5次才能达到效果,这个比较明显效率很低的。
二叉树
后面采用了红黑树来解决这样的问题,如下图所示。在先前的基础上确实优化了不少,减少了比较的次数,但是还是会存在树会越来越高的情况,当每一层元素放满时,就会增加层数,提高了树的高度。
红黑树
再后来MySQL就采用了B+数解决了树高度的问题,我们从B+数的数据结构来分析,这里设置Max.Degree就是树的最大高度为多少,这样就能控制树的高度,并且,你们可以发现叶子节点是完整的所有数据,并且采用了双向链表的数据结构。
B+树
B树/B-树
这是B树也可以叫B-树,与B+树不同的是 ,B树上也降低了树的高度问题
索引分类
在了解了这些数据结构后,我们再了解MySQL有哪些不同的索引
按照以下划分MySQL中不同的索引
- 按照数据结构分:B+树索引、Hash索引、Full-text索引
- 按物理存储分:聚簇索引、非聚簇索引
- 按字段特性分:主键索引、唯一索引、普通索引、前缀索引
细说索引
这样区分过后,我们在来细说MySQL中的索引
B+树索引
我们按照上述的分类来说,B+树索引是现在MySQL最常用的索引数据结构,B+树通常会在非叶子节点存储索引,在叶子节点存储数据,并且由于叶子节点上是通过双向链表来连接的,这样的查询效率非常高,正是有了指针在当中的存储,B+树就能进行范围查询,可行性很高。可以采用最少的层,管理最多的数据。
(这里补充一点)
为什么没有采用B树(B-树)
因为在B树中,是将非叶子节点的数据同时存储了索引和数据①从全局的角度而言,我们如果需要范围查询,B+树的优势就很明显,只需要遍历两个节点就可以拿到范围数据,而B树是需要逐一对比②在全文扫描中,B+树只需要扫描叶子节点即可,而B树需要遍历整个树。
Hash索引
Hash索引其实也就是采用Hash表进行存储的,通过Hash的算法,将值存储在表中,这样的优势是非常明显的,也就是精准查询的效率非常高,只要查询的是具体的值,通过Key-value,这样只需要O(1)的时间复杂度就可以查询到值,那么缺点也就明显出来了,就是无法进行范围查询。
Full-text索引
全文索引是在MySQL5.6之后才允许在InnoDB存储引擎中使用的,之前只能用于MyISAM中,并且设置的列中只能为类型是Char、Varchar、Text的类型,在全文索引中,会匹配整个单词,而不是部分单词。
非聚簇和聚簇索引区别
简单来说,聚簇索引就是基于主键索引创建的索引,其余的都称为非聚簇索引。在InnoDB中本身就是按照B+树的结果来存储所有的数据和索引,最后也只会产生一个文件,这也意味着必须是需要有主键的,但是如果没有给主键,InnoDB也会自动的生成一个隐藏列(rowID),作为自增型的主键,存储在B+树上,这也是为什么推荐使用自增型的主键,因为如果采用类型UUID的这种随机数插入,B+树的插入数据的就需要不断的变更树,使其平衡,效率也就降低了。而非聚簇索引则是将数据和索引分开的,典型的就是MyISAM存储引擎。这也就说明MyISAM的存储引擎是非聚簇的,而InnoDB是聚簇的。