MySQL中的索引

发布于:2024-06-15 ⋅ 阅读:(113) ⋅ 点赞:(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进行回表查询,再次走聚集索引


网站公告

今日签到

点亮在社区的每一天
去签到