MySQL索引分类

1. 什么是索引

索引(index)是帮助MySQL高效获取数据的数据结构。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。

2. 索引的特点

优势劣势
提高数据检索的效率,降低数据库的IO成本索引列也是要占用空间的。
通过索引列对数据进行排序,降低 数据排序的成本,降低CPU的消 耗。同时却也降低更新表的速度, 如对表进行INSERT、UPDATE、DELETE时,效率降低。

3. 索引的分类

这里按照不同维度,对索引分类
在这里插入图片描述

3.1 数据结构

按照索引实现时使用的数据结构大致分为 B树索引、哈希索引、空间索引、全文索引

不同的存储引擎对于索引结构的支持情况。

索引InnoDBMyISAMMemory
B树索引支持支持支持
哈希索引不支持不支持支持
空间索引支持(5.7及之后版本)支持不支持
全文索引支持(5.6及之后版本)支持不支持

3.1.1 B树索引

最常见的索引类型,大部分引擎都支持该索引。
在这里插入图片描述
数据结构为B+Tree,B+Tree是B-Tree的变种,基于平衡二叉树的一种多路平衡查找树,所有记录都按照顺序存放在叶子节点中,各个叶子节点直接通过链表相连。与B-Tree不同的是:非叶子节点只存储键值信息。所有叶子节点之间都有一个链指针。数据记录都存放在叶子节点中。

3.1.2 哈希索引

哈希索引就是采用一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在hash表中。
如果两个(或多个)键值,映射到一个相同的槽位上,他们就产生了hash冲突(也称为hash碰撞),可以通过链表来解决。
A. Hash索引只能用于对等比较(=,in),不支持范围查询(between,>,< )
B. 无法利用索引完成排序操作
C. 查询效率高,通常(不存在hash冲突的情况)只需要一次检索就可以了,效率通常要高于B+tree索引

3.1.3 空间索引

空间索引是一种基于空间数据类型的索引,用于加速空间数据查询。它使用一种称为R-Tree的数据结构来存储和查询空间数据。

R-Tree是一种多维空间索引数据结构,它具有以下特点:

  1. 高效的空间查询:R-Tree使用分层的结构来组织空间数据,每个节点代表一个区域,并包含该区域内的所有空间数据。这种分层结构使得空间查询可以在很低的复杂度上进行,从而提高了查询效率。
  2. 插入和删除操作的平衡:R-Tree的节点数量在插入和删除操作时保持平衡,这确保了空间索引的稳定性和查询性能。
  3. 自适应性强:R-Tree的节点大小和分支因子根据数据负载进行调整,这使得它能够适应不同数据集的规模和分布。
    在MySQL中,空间索引通常用于存储和查询二维或三维空间数据,例如地理位置、地图数据、网格数据等。为了使用空间索引,需要在创建表时指定空间数据类型,并使用SPATIAL关键字指定索引为空间索引。

3.1.4 全文索引

全文索引(Full-Text) 是一种用于全文搜索的数据结构,它可以在大型文本数据集中快速查找包含特定关键字的文本段落。MySQL使用一种称为倒排索引(Inverted Index)的数据结构来实现全文索引。

倒排索引是一种常见的数据结构,它用于将文档中的关键字与包含该关键字的文档建立索引。在MySQL全文索引中,倒排索引由两个主要部分组成:关键字列表和文档列表。

  1. 关键字列表:关键字列表是一个包含所有文档中出现的不同关键字的列表。每个关键字都与一个或多个文档相关联,这些文档包含该关键字。
  2. 文档列表:对于每个包含关键字的文档,都有一个对应的文档列表。文档列表包含了包含关键字的所有段落的标识符和出现次数。
    通过使用倒排索引,MySQL可以在O(1)的时间复杂度内快速地定位包含特定关键字的文档。使用全文索引,可以在大型文本数据集中进行高效的搜索和筛选操作。

MySQL全文索引支持多种数据类型,包括 TEXTVARCHAR 等。为了创建一个全文索引,需要在创建表时使用FULLTEXT 关键字指定索引类型。

3.2 功能特性

按照字段不同的功能特性可将索引分为 常规索引、唯一索引、空间索引、全文索引

3.2.1 常规索引

常规索引是一种最常用的索引类型,InnoDB引擎中就是B+树索引。常规索引可以在不同数据类型上使用,包括整数、浮点数、日期和时间等。
在创建普通索引时,不附加任何限制条件,只是用于提高查询效率。

3.2.2 唯一索引

使用 UNIQUE 参数可以设置索引为唯一性索引,在创建唯一性索引时,限制该索引的值必须是唯一的,但允许有空值。在一张数据表里可以有多个唯一索引。
唯一索引的值必须是唯一的,不能存在重复的值。如果插入重复的值,则会报错。
主键索引就是一种特殊的唯一性索引,在唯一索引的基础上增加了不为空的约束。

3.3 存储形式

根据索引的存储形式,又可以分为以下两种:聚簇索引(Clustered Index) 二级索引(Secondary Index)

3.3.1 聚簇索引

将数据存储与索引放到了一块,索引结构的叶子节点保存了行数据,表中必须有,而且只有一个。
聚集索引选取规则:

  1. 如果存在主键,主键索引就是聚集索引。
  2. 如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引。
  3. 如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引。

3.3.2 二级索引(非聚簇索引)

将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键(就是聚簇索引对应字段的值)

对于二级索引,当我们执行如下的SQL语句时,具体的查找过程是什么样子的
在这里插入图片描述
具体过程如下:

  1. 由于是根据name字段进行查询,所以先根据name='Arm’到name字段的二级索引中进行匹配查 找。但是在二级索引中只能查找到 Arm 对应的主键值 10。
  2. 由于查询返回的数据是 * ,所以此时,还需要根据主键值10,到聚集索引中查找10对应的记录,最终找到10对应的行row。
  3. 最终拿到这一行的数据,直接返回即可。

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

3.4 字段个数

根据索引对应表字段个数,可以将索引分为单列索引和联合索引

3.4.1 单列索引

单列索引是在一个列上创建的索引,用于加速对该列的查询操作。

单列索引的特点如下:

  1. 只针对一个列进行索引,适用于查询条件简单的情况。
  2. 索引的建立和维护较为简单,性能较好。

3.4.2 联合索引

联合索引是在多个字段上创建的索引,可以通过这几个字段进行查询。

在使用联合索引进行查询的时候,如果不遵循 最左前缀原则 ,联合索引会失效,这样就无法利用到索引快速查询的特性了。就是说只有查询条件中使用了这些字段的第一个字段时才会被使用。例如,在表的字段 id、name 和 gender 上建立一个联合索引后,只有在查询条件中使用了字段 id 时该索引才会被使用。
也可以这么理解,可以将建立联合索引的各个字段看作 小区、楼号、层号、房间号,要使用楼号、层号、房间号等查询时,必须知道小区,否则就会在所有小区,找对应的楼号 (全表扫描)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值