** 📝个人主页:五敷有你 **
** 🔥系列专栏:面经**
⛺️稳中求进,晒太阳
索引的概述
索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足 特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构 上实现高级查找算法,这种数据结构就是索引。
假如我们要执行的SQL语句为 : select * from user where age = 45;
1). 无索引情况
在无索引情况下,就需要从第一行开始扫描,一直扫描到最后一行,我们称之为 全表扫描,性能很 低。
2). 有索引情况
如果我们针对于这张表建立了索引,假设索引结构就是二叉树,那么也就意味着,会对age这个字段建 立一个二叉树的索引结构。
此时我们在进行查询时,只需要扫描三次就可以找到数据了,极大的提高的查询的效率。
索引结构
概述
MySQL的索引是在存储引擎层实现的,不同的存储引擎有不同的索引结构,主要包含以下几种:
上述是MySQL中所支持的所有的索引结构,接下来,我们再来看看不同的存储引擎对于索引结构的支持 情况。
我们平常所说的索引,如果没有特别指明,都是指B+树结构组织的索引。
B+Tree
B+Tree是B-Tree的变种,我们以一颗最大度数(max-degree)为4(4阶)的b+tree为例,来看一 下其结构示意图:
我们可以看到,两部分:
绿色框框起来的部分,是索引部分,仅仅起到索引数据的作用,不存储数据。
红色框框起来的部分,是数据存储部分,在其叶子节点中要存储具体的数据。
上述我们所看到的结构是标准的B+Tree的数据结构,接下来,我们再来看看MySQL中优化之后的 B+Tree。
MySQL索引数据结构对经典的B+Tree进行了优化。在原B+Tree的基础上,增加一个指向相邻叶子节点 的链表指针,就形成了带有顺序指针的B+Tree,提高区间访问的性能,利于排序。
Hash
MySQL中除了支持B+树索引,还支持一种索引 Hash索引。
1). 结构
哈希索引就是采用一定的hash算法,**将键值换算成新的hash值,映射到对应的槽位上,然后存储在 hash表中**。
如果两个(或多个)键值,映射到一个相同的槽位上,他们就产生**了hash冲突**(也称为hash碰撞),可 以通过链表来解决。
2)特点:
Hash索引只能对等比较(=,in) ,不支持范围查询(between , > , < , 。。)
无法利用索引完成排序操作。
查询效率高,通常在不存在hash冲突的情况下,只需要检索一次。
3)存储引擎支持:
支持hash索引的是Memory存储引擎。 而InnoDB中具有自适应hash功能,hash索引是 InnoDB存储引擎根据B+Tree索引在指定条件下自动构建的。
索引的分类
索引的分类
在MySQL数据库,将索引的具体类型主要分为以下几类:主键索引、唯一索引、常规索引、全文索引。
聚集索引和二级索引
而在在InnoDB存储引擎中,根据索引的存储形式,又可以分为以下两种:
聚集索引选取规则:
如果存在主键,主键就是聚集索引。
如果不存在主键,将使用第一个唯一索引作为聚集索引。
如果没有主键和唯一索引。innodb则会自动生成一个rowid作为隐藏的聚簇索引。
聚集索引和二级索引的具体结构如下:
接下来,我们来分析一下,当我们执行如下的SQL语句时,具体的查找过程是什么样子的。
具体过程是:
由于是name创建的二级索引,使用name的值进行匹配,但在二级索引中只找到arm的id,
由于查询返回的数据是* ,所以还需要根据主键值10。到聚集索引中查找10对应的记录,最终找到10对应的行row。
最终拿到这一行的数据,直接返回。
回表查询: 这种先到二级索引中查找数据,找到主键值,然后再到聚集索引中根据主键值,获取 数据的方式,就称之为回表查询。
版权归原作者 五敷有你 所有, 如有侵权,请联系我们删除。