当前位置: 首页> 教育> 锐评 > MySQL中的索引

MySQL中的索引

时间:2025/7/9 13:28:01来源:https://blog.csdn.net/rnnf_yyds/article/details/139602093 浏览次数:0次

一、索引概述

1.1 介绍

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

争对与一张表有无设计索引的情况

如果有索引,那么这个时候形成的二叉树索引结构效率上比全表扫描要快很多

1.2 索引的优缺点

优点缺点
提高数据检索的效率,降低数据库 的IO成本建立的索引列也是会占取一定空间的
通过索引列对数据进行排序,降低 数据排序的成本,降低CPU的消 耗索引大大提高了查询效率,同时却也降低更新表的速度, 如对表进行INSERT、UPDATE、DELETE时,效率降低。

1.3 创建、查看、删除索引的语法

创建索引

 CREATE  [ UNIQUE | FULLTEXT ]  INDEX  index_name  ON  table_name  ( 
index_col_name,... ) 

查看索引

 SHOW  INDEX  FROM  table_name

删除索引

DROP  INDEX  index_name  ON  table_name

二、索引底层的数据结构

 2.1 基于现阶段默认InnoDB存储引擎下介绍其底层的数据结构

索引的底层是B+tree,B+Tree是B-Tree的变种,这里我们可以基于下方这个网站学习结构

B+ Tree Visualization (usfca.edu)icon-default.png?t=N7T8https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html

2.2 B+tree

B+tree特点:

  1. 所有的数据都会出现在叶子节点。
  2. 叶子节点形成一个单向链表。
  3. 非叶子节点仅仅起到索引数据作用,具体的数据都是在叶子节点存放的。

区别于MySQL中的索引底层:

MySQL索引数据结构对经典的B+Tree进行了优化。在原B+Tree的基础上,增加一个指向相邻叶子节点 的链表指针,就形成了带有顺序指针的B+Tree,提高区间访问的性能,利于排序,叶子节点就形成了一个双向链表 

2.3 B-Tree

B-Tree,B树是一种多叉路衡查找树,相对于二叉树,B树每个节点可以有多个分支,即多叉。 以一颗最大度数(max-degree)为5(5阶)的b-tree为例,那这个B树每个节点最多存储4个key,5 个指针

B-Tree Visualization (usfca.edu)icon-default.png?t=N7T8https://www.cs.usfca.edu/~galles/visualization/BTree.html

特点: 

  1. 5阶的B树,每一个节点最多存储4个key,对应5个指针
  2. 一旦节点存储的key数量到达5,就会裂变,中间元素向上分裂
  3. 在B树中,非叶子节点和叶子节点都会存放数据

三、索引分类

3.1 MySQL中的索引分类

分类含义特点关键字
主键索引针对于表中主键创建的索引默认自动创建, 只能有一个PRIMARY
唯一 索引避免同一个表中某数据列中的值重复可以有多个UNIQUE
常规索引快速定位特定数据可以有多个
全文索引全文索引查找的是文本中的关键词,而不是比较索引中的值可以有多个FULLTEXT

对于全文索引来说,用的比较少

3.2 聚集索引、二级索引

根据索引的形式上来分,可以抽取为聚集索引和二级索引

分类含义特点
聚集索引(Clustered Index)将数据存储与索引放到了一块,索引结构的叶子 节点保存了行数据必须有,而且只 有一个
二级索引(Secondary Index)将数据与索引分开存储,索引结构的叶子节点关 联的是对应的主键可以存在多个

聚集索引选取规则:

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

设表结构,聚集索引和二级索引的具体结构如下:

图来源黑马MySQL教程 

我们可以看出聚集索引的叶子节点挂载的是row(行数据),二级索引的叶子节点下挂载的是该字段的对应主键id值

3.3 回表查询

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

执行一条sql

select * from user where name = 'Arm'

 图来源黑马MySQL教程 

对应的表结构如上图,三个字段,id,name,gender

对于上述执行的sql,根据name去查询数据,这个时候走二级索引,发现gender没加索引,所以会根据主键id进行回表查询,再次走聚集索引

关键字:MySQL中的索引

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: