MySQL的索引

       📝个人主页:五敷有你      

 🔥系列专栏:面经

⛺️稳中求进,晒太阳

索引的概述

        索引(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。

最终拿到这一行的数据,直接返回。

回表查询: 这种先到二级索引中查找数据,找到主键值,然后再到聚集索引中根据主键值,获取 数据的方式,就称之为回表查询。

相关推荐

  1. MySQL索引类型

    2024-05-11 23:46:13       25 阅读
  2. MySQL索引

    2024-05-11 23:46:13       25 阅读
  3. 谈谈 MySQL 索引

    2024-05-11 23:46:13       16 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-11 23:46:13       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-11 23:46:13       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-11 23:46:13       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-11 23:46:13       20 阅读

热门阅读

  1. 【重学C语言】十三、字符串

    2024-05-11 23:46:13       11 阅读
  2. js原生三种弹框

    2024-05-11 23:46:13       11 阅读
  3. 详解Python 中可视化数据分析工作流程

    2024-05-11 23:46:13       10 阅读
  4. 天童教育:孩子是难以改变的,除非他感觉到爱

    2024-05-11 23:46:13       12 阅读
  5. 【MySQL】表的增删改查(基础)

    2024-05-11 23:46:13       11 阅读
  6. matlab二次插值函数 interp2

    2024-05-11 23:46:13       12 阅读
  7. Qt 简单使用串口

    2024-05-11 23:46:13       13 阅读
  8. 面试题:Go协程泄漏原因及解决方法

    2024-05-11 23:46:13       14 阅读