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 中十分重要的一个知识了,所以我们要更加深入的了解索引的知识。到这里这个博客就结束了,让我们下次再见~拜拜~~~

相关推荐
远歌已逝1 小时前
维护在线重做日志(二)
数据库·oracle
qq_433099402 小时前
Ubuntu20.04从零安装IsaacSim/IsaacLab
数据库
Dlwyz2 小时前
redis-击穿、穿透、雪崩
数据库·redis·缓存
工业甲酰苯胺4 小时前
Redis性能优化的18招
数据库·redis·性能优化
没书读了5 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
i道i6 小时前
MySQL win安装 和 pymysql使用示例
数据库·mysql
小怪兽ysl6 小时前
【PostgreSQL使用pg_filedump工具解析数据文件以恢复数据】
数据库·postgresql
wqq_9922502776 小时前
springboot基于微信小程序的食堂预约点餐系统
数据库·微信小程序·小程序
爱上口袋的天空6 小时前
09 - Clickhouse的SQL操作
数据库·sql·clickhouse
Oak Zhang7 小时前
sharding-jdbc自定义分片算法,表对应关系存储在mysql中,缓存到redis或者本地
redis·mysql·缓存