MySQL主要索引有哪4种

2025-04-1905:34:30常识分享0

官方定义:索引是帮助 MySQL 高效获取数据的数据结构。

从上述定义中,我们可以了解到索引的主要作用是帮助我们高效获取数据。在正式介绍索引前,我们先来了解一下基本的数据结构。

Hash 索引是比较常见的一种索引类型。它通过计算出记录对应的 hash 值,然后根据计算结果存储在对应位置。查询的时候也是根据 hash 值快速找到位置。单条记录查询的效率很高,时间复杂度为1。Hash索引并不是最常用的数据库索引类型,尤其是我们常用的Mysql Innodb引擎并不支持hash索引。

Hash 索引在等值查询时速度很快,但存在以下问题:

1. 不支持范围查询。

2. 存在hash冲突,当两条记录的hash值相就会产生hash冲突,需要在后面用链表存储起来。

平衡二叉树(又称L树)是一种特殊的二叉树,它的左子节点的值小于父节点值,右子节点的值大于父节点值,采用二分查找,速度较快。在平衡二叉树中,如果出现节点数据越来越大的情况,搜索性能会降低。

B树是磁盘友好型的数据结构,是平衡多路查找树,节点可以有多个子节点。在数据库系统中,B树常被用于实现索引。B树的特点包括:

1. 排序方式:所有节点关键字是按递增次序排列的。

2. 子节点数:非叶节点(根节点和枝节点)的子节点数大于1且不超过M,且M大于等于2(注:M阶代表一个树节点最多有多少个子节点)。

3. 关键字数量:枝节点的关键字数量大于等于ceil(M/2)-1且小于M-1(注:ceil()是向上取整函数)。

4. 叶子节点:所有叶子节点都在同一层,且包含关键字和指向子节点的指针(通常为null)。

MySQL中B+树存储结构是B树的一种变形,它在B树的基础上进行了改进,主要提高了查询的稳定性和数据排序的友。MySQL索引的底层数据结构采用的就是B+树。

在B+树的基础上,还有一个变种叫B树,它是将索引层用指针连接起来的B+树。

分析了以上几种数据结构,MySQL 采用的是 B+ 树来存储索引,综合来说,这样查询效率最好。Oracle 采用的是 B 树。

MySQL的索引主要有以下几种:

1. 主键索引:一种特殊的索引,一般在建表时会设置。MySQL会默认对这个主键加上索引。主键索引的叶子节点存储的是数据表某一行的数据。

2. 唯一索引:与主键索引类似,要求索引列的值必须唯一,但允许有空值。

3. 普通索引:最基本的索引,没有任何限制。

4. 组合索引:给多个字段同时加上索引。在使用时需遵循最左匹配原则。

5. 全文索引:主要用于文本数据的搜索。与常见的搜索引擎功能相似,MySQL全文索引的性能一般,所以通常不使用。

三星索引是我们设计MySQL索引时的一个规范,符合三星索引的索引设计通常是比较好的设计。具体包括:一星要求索引中查询相关的索引行是相邻的;二星要求索引中数据列的顺序和查找中的排序顺序相同;三星要求索引中的列包含了查询所需要的数据列。

1. 索引相关概念

ref:不使用唯一索引,而是使用普通索引时,可能会匹配到多个条件。idx_name即是一个普通索引。

ref_of_null:与ref类似,但能额外搜索索引中包含NULL值的记录。当数据库中存在name字段为null的数据时,这个功能特别有用。

range:在索引字段上执行范围查询,如使用大于、小于、in、like等查询条件。

index:通过索引树进行全表扫描。

ALL:进行全面表扫描,不使用索引。

2. 可能用到的索引(possible_keys)

MySQL在解析查询时会分析可能使用的索引,但实际的查询过程中不一定都会使用。例如,虽然idx_name可能会被分析为可能使用的索引,但实际查询可能并未使用。

3. 实际使用的索引(key)

在执行查询时,MySQL会选择实际使用的索引。例如,查询中可能会实际使用idx_name这个索引。

4. 索引列长度(key_len)

这表示查询所使用的索引列的长度。对于utf8字符集下的name字段,每个字符占3个字节,varchar(20)则占用60个字节,加上额外的字节用于存储字符长度和可能的null值,得出key_len为63。

5. ref列

当使用索引列等值匹配的条件进行查询时,ref列显示与索引列作等值匹配的具体信息。

6. 预计需要扫描的行数(rows)

这个字段表示MySQL预计需要扫描的行数。

7. filtered

这是一个百分比值,表示表里符合条件的记录数的百分比。简单来说,它表示存储引擎返回的数据在经过过滤后,剩下满足条件的记录数量的比例。

8. Extra

Extra字段用于提供额外的信息,帮助我们更好地理解查询。例如,如果name字段上进行了函数操作,可能导致索引失效。

关于联合索引和面试资料

创建一张包含name、price、mark三个字段的联合索引的goods表。

在查询时,遵循联合索引的最左前缀原则,即从最左侧开始的字段进行查询,并且不跳过任何字段。

如果查询直接从中间某个字段开始,而不是从最左侧开始,那么查询类型可能会从ref变成index。这是因为MySQL按照组合索引中的字段顺序来排序的。如果跳过中间某个字段,那么索引可能不再有序。

覆盖索引是指查询的字段全部包含在索引列中,不需要再次回表查询。