20_mysql索引的分类、创建与删除

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 学习笔记
参考来源:

康师傅:https://www.bilibili.com/video/BV1iq4y1u7vj?p=128

爱编程的大李子:https://blog.csdn.net/LXYDSF/article/details/126247744

一、索引的声明与使用

1. 索引的分类

MySQL 的索引包括普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等。

  • 功能逻辑 按照上说,索引主要有 4 种:普通索引、唯一索引、主键索引、全文索引
  • 按照 物理实现方式 ,索引可以分为 2 种:聚簇索引非聚簇索引
  • 按照 作用字段个数 进行划分,分成单列索引联合索引

2. 创建索引

MySQL支持多种方法在单个或多个列上创建索引:在创建表的定义语句CREATE TABLE中指定索引列,使用 ALTER TABLE 语句在存在的表上创建索引,或者使用CREATE INDEX 语句在已存在的表上添加索引。

2.1 创建表的时候创建索引

使用CREATE TABLE创建表时,除了可以定义列的数据类型外,还可以定义主键约束、外键约束或者唯一性约束,而不论创建哪种约束,在定义约束的同时相当于在指定列上创建了一个索引。

  • 隐式的索引创建

    # 1.隐式的添加索引(在添加有主键约束、唯一性约束或者外键约束的字段会自动的创建索引)
    CREATE TABLE dept(
        dept_id INT PRIMARY KEY AUTO_INCREMENT,# 创建主键索引
        dept_name VARCHAR(20)
    );
    CREATE TABLE emp(
        emp_id INT PRIMARY KEY AUTO_INCREMENT,# 主键索引
        emp_name VARCHAR(20) UNIQUE,# 唯一索引
        dept_id INT,
        CONSTRAINT emp_dept_id_fk FOREIGN KEY(dept_id) REFERENCES dept(dept_id)
    ); # 外键索引
  • 显式的索引创建的话,基本语法格式如下,共有七种情况~

    CREATE TABLE table_name [col_name data_type]
    [UNIQUE | FULLTEXT | SPATIAL] [INDEX | KEY] [index_name] (col_name [length]) [ASC | DESC]
    • UNIQUEFULLTEXTSPATIAL 为可选参数,分别表示唯一索引、全文索引和空间索引;
    • INDEXKEY 为同义词,两者的作用相同,用来指定创建索引;
    • index_name 指定索引的名称,为可选参数,如果不指定,那么 MySQL 默认 col_name 为索引名;
    • col_name为需要创建索引的字段列,该列必须从数据表中定义的多个列中选择;
    • length 为可选参数,表示索引的长度,只有字符串类型的字段才能指定索引长度;
    • ASCDESC 指定升序或者降序的索引值存储。
    • 特例:主键索引使用主键约束的方式来创建。

2.1.1 创建普通索引

# 创建普通的索引
CREATE TABLE user(
    id INT ,
    name VARCHAR(100),
    # 声明索引
    INDEX idx_name(name)
);

2.1.2 创建唯一索引

# ②创建唯一索引
CREATE TABLE user (
      id INT,
    name VARCHAR(100),
    email VARCHAR(100),
    # 声明索引
      UNIQUE INDEX uk_idx_email (email)
);

2.1.3 创建主键索引

# 主键索引

create table user(
    id int primary key, # 通过定义主键约束的方式定义主键索引
    name varchar(100)
) ;

2.1.4 创建组合索引

# 创建联合索引
create table user(
    id INT,
    name VARCHAR(100),
    age TINYINT (3),
    index mul_name_age(name,age)    
)

2.2 在已经存在的表上创建索引

在已经存在的表中创建索引可以使用 ALTER TABLE 语句或者 CREATE INDEX 语句。

2.2.1 使用 ALTER TABLE 语句创建索引

ALTER TABLE table_name ADD [UNIQUE | FULLTEXT | SPATIAL] [INDEX | KEY]
[index_name] (col_name[length],...) [ASC | DESC]
# 给用户表的name字段添加索引
ALTER TABLE user ADD INDEX idx_name(name);

2.2.2 使用 CREATE INDEX 创建索引

CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name
ON table_name (col_name[length],...) [ASC | DESC]
# 给用户表的name字段添加索引
CREATE INDEX idx_name ON user(name);

3. 查看索引

通过命令查看索引有没有创建成功

# 方式1:
SHOW CREATE TABLE book;

# 方式2:
SHOW INDEX FROM book;

性能分析工具:EXPLAIN,查看索引是否正在使用

EXPLAIN SELECT * from user where user_name = '张三';

4. 删除索引

MySQL中删除索引使用 ALTER TABLEDROP INDEX 语句,两者可实现相同的功能,DROP INDEX语句在内部被映射到一个ALTER TABLE语句中

# ALTER TABLE删除索引
ALTER TABLE table_name DROP INDEX index_name;

# DROP INDEX删除索引
DROP INDEX index_name ON table_name;

二、MySQL 8.0 索引新特性

1. 支持降序索引

降序索引以降序存储键值。虽然在语法上,从MySQL 4版本开始就已经支持降序索引的语法了,但实际上该DESC定义是被忽略的,直到MySQL 8.x版本才开始真正支持降序索引(仅限于InnoDB存储引擎)。

MySQL在8.0版本之前创建的仍然是升序索引,使用时进行反向扫描,这大大降低了数据库的效率。在某些场景下,降序索引意义重大。例如,如果一个查询,需要对多个列进行排序,且顺序要求不一致,那么使用降序索引将会避免数据库使用额外的文件排序操作,从而提高性能。

2. 隐藏索引(invisible indexes)

在 MySQL 5.7 版本及之前,只能通过显式的方式删除索引。此时,如果发现删除索引后出现错误,又只能通过显式创建索引的方式将删除的索引创建回来。如果数据表中的数据量非常大,或者数据表本身比较大,这种操作就会消耗系统过多的资源,操作成本非常高。

从MySQL 8.x 开始支持 隐藏索引(invisible indexes),只需要将待删除的索引设置为隐藏索引,使查询优化器不再使用这个索引(即使使用 force index(强制使用索引),优化器也不会使用该索引), 确认将索引设置为隐藏索引后系统不受任何响应,就可以彻底删除索引。这种通过先将索引设置为隐藏索引,再删除索引的方式就是软删除。

  • 在 MySQL 中创建隐藏索引通过 SQL 语句 INVISIBLE 来实现,其语法形式如下:

    CREATE TABLE tablename(
        propname1 type1[CONSTRAINT1],
        propname2 type2[CONSTRAINT2],
        ......
        propnamen typen,
        INDEX [indexname](propname1 [(length)]) INVISIBLE
    );

    上述语句比普通索引多了一个关键字 INVISIBLE,用来标记索引为不可见索引。

  • 在已经存在的表上创建

    CREATE INDEX indexname
    ON tablename(propname[(length)]) INVISIBLE;
  • 通过 ALTER TABLE 语句创建

    ALTER TABLE tablename
    ADD INDEX indexname (propname [(length)]) INVISIBLE;
  • 切换索引可见状态

    已存在的索引可通过如下语句切换可见状态:

     ALTER TABLE tablename ALTER INDEX index_name INVISIBLE; #切换成隐藏索引 
     ALTER TABLE tablename ALTER INDEX index_name VISIBLE; #切换成非隐藏索引
注意:当索引被隐藏时,它的内容仍然是和正常索引一样实时更新的。如果一个索引需要长期被隐藏,那么可以将其删除,因为索引的存在会影响插入、更新和删除的性能。

使隐藏索引对查询优化器可见(了解)

在 MySQL 8.x 版本中,为索引提供了一种新的测试方式,可以通过查询优化器的一个开关 (use_invisible_indexes)来打开某个设置,使隐藏索引对查询优化器可见。如果 use_invisible_indexes 设置为 off(默认),优化器会忽略隐藏索引。如果设置为 on,即使隐藏索引不可见,优化器在生成执行计划时仍会考虑使用隐藏索引。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
缓存 关系型数据库 MySQL
MySQL索引策略与查询性能调优实战
在实际应用中,需要根据具体的业务需求和查询模式,综合运用索引策略和查询性能调优方法,不断地测试和优化,以提高MySQL数据库的查询性能。
204 66
|
20天前
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
119 9
|
3月前
|
存储 关系型数据库 MySQL
阿里面试:为什么要索引?什么是MySQL索引?底层结构是什么?
尼恩是一位资深架构师,他在自己的读者交流群中分享了关于MySQL索引的重要知识点。索引是帮助MySQL高效获取数据的数据结构,主要作用包括显著提升查询速度、降低磁盘I/O次数、优化排序与分组操作以及提升复杂查询的性能。MySQL支持多种索引类型,如主键索引、唯一索引、普通索引、全文索引和空间数据索引。索引的底层数据结构主要是B+树,它能够有效支持范围查询和顺序遍历,同时保持高效的插入、删除和查找性能。尼恩还强调了索引的优缺点,并提供了多个面试题及其解答,帮助读者在面试中脱颖而出。相关资料可在公众号【技术自由圈】获取。
|
3天前
|
SQL 存储 关系型数据库
MySQL秘籍之索引与查询优化实战指南
最左前缀原则。不冗余原则。最大选择性原则。所谓前缀索引,说白了就是对文本的前几个字符建立索引(具体是几个字符在建立索引时去指定),比如以产品名称的前 10 位来建索引,这样建立起来的索引更小,查询效率更快!
45 22
 MySQL秘籍之索引与查询优化实战指南
|
5天前
|
存储 关系型数据库 MySQL
MySQL中为什么要使用索引合并(Index Merge)?
通过这些内容的详细介绍和实际案例分析,希望能帮助您深入理解索引合并及其在MySQL中的
21 10
|
25天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化以及慢查询优化
通过本文的介绍,希望您能够深入理解MySQL索引优化和慢查询优化的方法,并在实际应用中灵活运用这些技术,提升数据库的整体性能。
63 18
|
17天前
|
存储 Oracle 关系型数据库
索引在手,查询无忧:MySQL索引简介
MySQL 是一款广泛使用的关系型数据库管理系统,在2024年5月的DB-Engines排名中得分1084,仅次于Oracle。本文介绍MySQL索引的工作原理和类型,包括B+Tree、Hash、Full-text索引,以及主键、唯一、普通索引等,帮助开发者优化查询性能。索引类似于图书馆的分类系统,能快速定位数据行,极大提高检索效率。
48 8
|
24天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化以及慢查询优化
通过本文的介绍,希望您能够深入理解MySQL索引优化和慢查询优化的方法,并在实际应用中灵活运用这些技术,提升数据库的整体性能。
23 7
|
23天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化与慢查询优化:原理与实践
通过本文的介绍,希望您能够深入理解MySQL索引优化与慢查询优化的原理和实践方法,并在实际项目中灵活运用这些技术,提升数据库的整体性能。
61 5
|
27天前
|
存储 关系型数据库 MySQL
Mysql索引:深入理解InnoDb聚集索引与MyisAm非聚集索引
通过本文的介绍,希望您能深入理解InnoDB聚集索引与MyISAM非聚集索引的概念、结构和应用场景,从而在实际工作中灵活运用这些知识,优化数据库性能。
114 7

推荐镜像

更多