MySQL—索引 |ू・ω・` )

文本目录:

❄️一、索引的介绍:

❄️二、索引的分类:

❄️三、索引的使用:

1、自动创建:

2、手动创建:

1)、主键索引:

2)、唯一索引:

3)、普通索引:

3、创建复合索引:

4、查看索引:

5、删除索引:

1)、删除主键索引:

2)、删除其他索引:

6、创建索引的注意事项:

❄️总结


❄️一、索引的介绍:

MySQL 的索引其实是一种数据结构,它可以帮助数据库高效的查询、更新数据表中的数据,索引通过一定的规则排列数据表中的记录,使得对表的查询可以通过 索引来加快速度。

其实 索引 就像是每本书都有的 目录 一样,通过指向数据行的位置,可以快速的定位和访问表中的数据,比如对于字典中的按笔画、按偏旁部首等来进行快速的查找要查找的字。

使用索引的目的:

对于使用索引的目的非常的简单,就是提升数据搜索的效率。
**对于索引中使用的数据结构是------**B+树

因为:

1、可以保证数据稳定有序,插入和修改都存在比较稳定的时间复杂度

2、非叶子结点仅具有索引作用,所有的数据都存放到叶子结点中

3、所有的叶子节点构成了一个有序的链表,可以遍历所有的数据,并且连接处呢是双向链表


❄️二、索引的分类:

1、主键索引:

a、当在一个表中使用 PRIMARY KEY 时,自动创建索引,索引的值就是主键值,InnoDB使用其作为 聚集索引 (聚簇索引)

b、推荐为每一个表都定义一个主键,如果没有逻辑上唯一且非空的列或列集可以使用主键,则添加一个自增列。
2、普通索引:

a、最基本的索引,没有唯一性的限制

b、可能为多列创建组合索引,称为复合索引或组全索引
3、唯一索引:

a、当在表上定义一个唯一键 UNIQUE 时,自动创建唯一索引。

b、与普通索引类似,但区别在于唯⼀索引的列不允许有重复值。
4、全文索引:

a、基于文本列(CHAR、VARCHAR或TEXT列)进行创建,以加快对这些列中包含的数据的查询。

b、用于全文搜索,仅限于 MyISAM 和 InnoDB 引擎支持使用
5、聚集索引:

a、与主键索引是同义词

b、如果没有为表定义 PRIMARY KRY ,InnoDB 将会使用第一个 UNIQUE 和 NOT NULL 的列作为聚集索引。

c、如果表中没有 PRIMARY KRY 和 合适的 UNIQUE 作为索引,InnoDB 会为新插入的行生成一个行号,并且用 6字节的 ROW_ID 记录,ROW_ID是单调递增的。
6、非聚集索引:

a、聚集索引以外的索引称之为 非聚集索引或者称为 二级索引

b、二级索引中的每条记录都包含该行的主键列,以及二级索引指定的列

c、InnoDB 使用这个主键值来搜索聚集索引中的行,这个过程称为回表查询

回表查询:通过索引记录中的主键值,再到主键值的索引树中去查询这个主键值就是回表查询
7、索引覆盖:

a、当一个 select 语句中使用了 普通索引 并且查询列表中的列刚好是创建普通索引时所有的列或者是部分列,这个时候呢,我们就不需要进行 回表查询 去查询要查找的列,直接就可以在普通索引中查找出来。


❄️三、索引的使用:

1、自动创建:

1)、当我们为一张表添加 主键约束、唯一约束、外键约束的时候呢,MySQL 会为对应的列自动创建一个索引。

2)、如果表不指定约束的时候呢,我们的MySQL会自动为每一列生成一个索引并且ROW_ID 标记。


2、手动创建:

1)、主键索引:

方式一:

创建表的时候创建主表。

方式二:

创建表的时候单独指定主键列。

复制代码
-- 创建表的时候单独指定主键。
create table t_pk2 (
 id bigint auto_increment,
 name varchar(30),
 primary key (id)
);

方式三:

修改表中的列为主键索引。

我们先来创建一个表:

这个时候呢,我们来查询 索引来看看:

我们可以看到这里什么也没有的,那么接下来我们进行添加主键操作:

总的代码就是:

java 复制代码
-- 修改表中的列为主键索引
create table t_pk3 (
 id bigint,
 name varchar(30)
);

alter table t_pk3 add primary key (id);
alter table t_pk3 modify id bigint auto_increment;
 

这里呢就出现了一个新的语法:

alter table 表名 [add(添加) | modify(更改) | drop(删除)] 要修改的内容;


2)、唯一索引:

这个唯一索引呢和上面的主键索引是的创建是差不多的,所以我们这里就来简单的来看一下:

方式一:

创建表的时候创建唯一索引。

java 复制代码
-- 创建表的时候创建唯一索引
create table t_uk1 (
id bigint primary key auto_increment,
name varchar(30) unique
);

方式二:

创建表的时候单独指定唯一索引。

java 复制代码
-- 创建表的时候单独指定唯一列
create table t_uk2 (
id bigint primary key auto_increment,
name varchar(30),
unique (name)
);

方式三:

修改表中的列为唯一索引 。

java 复制代码
-- 修改表中的列为唯一索引 。
create table t_uk3 (
id bigint primary key auto_increment,
name varchar(30)
);

alter table t_uk3 add unique (name);

我们呢,来查询一下对于唯一索引的表的结构:


3)、普通索引:

对于这个什么时候创建这个索引呢?

1、创建表的时候,明确的了解哪些列是频繁查询的,就进行创建,但是是在数据很多的时候。如果数据少的话,可能全表扫描是比索引的效率是高的。

2、在业务的不断发展的过程中,进行创建


对于普通索引的创建的语法:

index(列,列.....)

方式一:

在创建表的时候指定索引列。

java 复制代码
-- 在创建表的时候指定索引列
create table t_index1 (
id bigint primary key auto_increment,
name varchar(30) unique,
sn varchar(30),
index(sn)
);

我们来看一看对于这个 普通索引 的结构是怎样的:

这个就是对于普通索引的结构了。


方式二:

修改表中的列为普通索引。

java 复制代码
-- 修改表中的列为普通索引
create table t_index2 (
id bigint primary key auto_increment,
name varchar(30) unique,
sn varchar(30)
);

alter table t_index2 add index(sn);

这个就是方式二了,和我们上面对于 主键索引 和 唯一索引的方式三是一样额的。


方式三:

这个方式是我们对于创建 普通索引 经常使用的方式。

单独创建索引并指定索引名。

java 复制代码
-- 单独创建索引并指定索引名
create table t_index3 (
id bigint primary key auto_increment,
name varchar(30) unique,
sn varchar(30)
);

create index t_index3_sn on t_index3(sn);

我们来看看这个结构:

我们可以看到对于这个 索引名 的这个列呢,使用的是我们设置的名。

在这里呢,我们又看见了一个新的语法:

创建索引的语法:

create index索引名on****表名[(列),(列).....];

这里可以是单个列也可以是多个列进行创建 普通索引。


3、创建复合索引:

对于这个创建复合所以的方式和上面的对于 普通索引 的方式是差不多的,就是在列上进行了增加,列与列之间使用 逗号 隔开。

方式一:

创建表时指定索引列。

java 复制代码
-- 创建表时指定索引列
create table t_test_index1 (
id bigint primary key auto_increment,
name varchar(30) unique,
sn varchar(30),
class_id bigint,
index (sn,class_id)
);

我们来看看对于这个 复合索引 的结构是怎样的:

方式二:

修改表中的列为复合索引。

java 复制代码
-- 修改表中的列为复合索引
create table t_test_index2 (
id bigint primary key auto_increment,
name varchar(30) unique,
sn varchar(30),
class_id bigint
);

alter table t_test_index2 add index(sn,class_id);

这些都是比较简单的。

方式三:

单独创建索引并指定索引名。

java 复制代码
-- 单独创建索引并指定索引名
create table t_test_index3 (
id bigint primary key auto_increment,
name varchar(30) unique,
sn varchar(30),
class_id bigint
);

create index t_test_sn_class_id on t_test_index3(sn,class_id);
show index from t_test_index3;

4、查看索引:

对于这个查看索引呢,我们在上面已经使用过了,我们直接来介绍介绍对于查询的语法结构:

方式一:

show index 索引名 from 表名;

方式二:

show keys from 表名;

方式三:

desc 表名;(这个是简要查询)


5、删除索引:

1)、删除主键索引:

对于删除主键这个索引的操作是和删除其余索引有所不同的,我们来看看:

语法:

alter table 表名 drop primary key;

但是还是达不到直接删除的效果,我们来试试看:这个是什么意思呢,说明我们的这个主键存在自增的效果,不能进行删除操作,所以我们在删除之前呢,我们要先把 自增 这个操作给改变了


2)、删除其他索引:

这个删除操作呢,同样也是非常的简单的操作,我们来看看语法:

语法:

alter table 表名 drop index 索引名;


6、创建索引的注意事项:

a、索引应该创建在高频的查询的列上

b、索引需要占用额外的空间

c、对表进行插入、更新和删除操作的时候,同时也会修改索引,会对性能产生影响

d、创建过多的或者不合理的索引会导致性能下降,需要谨慎选择和规划索引


❄️总结:

OK,索引的基础呢到这里就结束了,这个索引也是 MySQL 中十分重要的一个知识了,所以我们要更加深入的了解索引的知识。到这里这个博客就结束了,让我们下次再见~拜拜~~~

相关推荐
TDengine (老段)44 分钟前
TDengine 的 AI 应用实战——运维异常检测
大数据·数据库·人工智能·物联网·时序数据库·tdengine·涛思数据
Le_ee1 小时前
dvwa7——SQL Injection
数据库·sql·网络安全·靶场·token·dvwa
依稀i1231 小时前
MySQL连接报SSL错误
数据库·mysql·ssl
kaede2 小时前
MySQL权限详解!
数据库·mysql
学海无涯,行者无疆2 小时前
深入浅出:Oracle 数据库 SQL 执行计划查看详解(1)——基础概念与查看方式
数据库·sql·oracle·执行计划·sql执行计划·查看执行计划·sql性能优化
多多*2 小时前
蓝桥杯国赛训练 day1
java·开发语言·数据库·redis·缓存·职场和发展·蓝桥杯
可观测性用观测云3 小时前
HikariCP 可观测性最佳实践
数据库
望获linux3 小时前
【Linux基础知识系列】第八篇-基本网络配置
linux·数据库·postgresql·操作系统·php·开源软件·rtos
小菜刀刀3 小时前
WAF绕过,网络层面后门分析,Windows/linux/数据库提权实验
数据库·windows
萝卜白菜。3 小时前
关于TongWeb数据源兼容mysql驱动的注意事项
java·mysql