saotolls 发表于 2024-9-7 13:55:38

MySQL索引基础知识

# MySQL索引基础知识

**定义**

> 索引存在于对应的索引文件中,索引本质就是一组排好了顺序的一组数据

**作用**

* 索引数据中进行排序时,避免再次排序
* 在索引数据中对数据行进行定位时,避免全表扫描

## 索引基本操作

查看表文件中已经存在的索引

```sql
SHOW INDEX FROM <表名>;
```

创建索引

```sql
CREATE INDEX <索引名称> ON <表名> (<字段名>);
```

删除索引

```sql
DROP INDEX <索引名称> ON <表名>;
```

## 索引的分类

### 聚簇索引与非聚簇索引

**聚簇索引**

> 只能来自于采用`Innodb`存储引擎表的数据

* MySQL自动将采用了`InnoDB`存储引擎表中的主键建立索引,这个索引就是`聚簇索引`;
* 如果当前表中没有主键,MySQL将会选择添加一个`唯一性约束`的字段,作为`聚簇索引`;
* 如果当前表中既没有主键字段,也没有添加了`唯一性约束`字段,MySQL将随机选取一个字段作为`聚簇索引`;
* 在采用`InnoDB存储引擎`的表文件中,必然存在一个聚簇索引;
* 在采用`InnoDB存储引擎`的表文件中,只能有一个聚簇索引;
* 在表文件中其他字段上建立的索引都是非聚簇索引;

**非聚簇索引**

* 由开发人员自行创建
* 对于采用了`InnoDB存储引擎`的数据表文件,除了一个`聚簇索引`之外,其他字段上创建的索引都是`非聚簇索引`;
* 在采用了`MYISAN存储引擎`的数据表文件中,创建的所有索引都是`非聚簇索引`;

**聚簇索引和非聚簇索引的区别**

聚簇索引:数据节点上存储的`当前数据所在行数`以及`当前数据所在数据行的内容`;因为聚簇索引的这种结构,所以在查询时可以直接在定位数据节点上,读取当前数据所在数据行中字段信息,不需要使用`I/O流`到磁盘上表文件上进行读取,因此执行效率较快;

非聚簇索引:数据节点上存储的`当前数据所在行数`;由于数据节点存储的当前数据所在行数,没有其他相关内容,所以定位之后,需要使用`I/O流`到硬盘i上表文件中定位数据行其他字段内容,因此执行效率相对较慢;

### 主键索引,唯一性索引

**主键索引**
如果当前表文件中字段添加了主键约束,MySQL主动的将当前字段上数据进行排序,其生成的索引被称为主键索引;

**唯一性索引**
如果当前表文件中字段添加了唯一性约束,MySQL主动的将当前字段上的数据进行排序,其生成的索引被称为唯一性索引;

**普通索引**
如果当前表文件中字段上没有添加任何约束霍索引,此时在这个字段上创建的索引就是普通索引;

**执行效率:主键索引 > 唯一性索引 > 普通索引**


### 单个索引,复合索引

- 单字段索引的创建
```sql
CREATE INDEX <索引名> ON <表名> (字段名);
```

- 复合索引的创建
```sql
CREATE INDEX <索引名> ON <表名> (字段名1, 字段名2, 字段名3, ...);
```

hyy 发表于 2024-12-2 16:26:34

催更催更催更
页: [1]
查看完整版本: MySQL索引基础知识