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

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

康师傅: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,即使隐藏索引不可见,优化器在生成执行计划时仍会考虑使用隐藏索引。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
15天前
|
存储 关系型数据库 MySQL
阿里面试:为什么要索引?什么是MySQL索引?底层结构是什么?
尼恩是一位资深架构师,他在自己的读者交流群中分享了关于MySQL索引的重要知识点。索引是帮助MySQL高效获取数据的数据结构,主要作用包括显著提升查询速度、降低磁盘I/O次数、优化排序与分组操作以及提升复杂查询的性能。MySQL支持多种索引类型,如主键索引、唯一索引、普通索引、全文索引和空间数据索引。索引的底层数据结构主要是B+树,它能够有效支持范围查询和顺序遍历,同时保持高效的插入、删除和查找性能。尼恩还强调了索引的优缺点,并提供了多个面试题及其解答,帮助读者在面试中脱颖而出。相关资料可在公众号【技术自由圈】获取。
|
1月前
|
存储 NoSQL 关系型数据库
为什么MySQL不使用红黑树做索引
本文详细探讨了MySQL索引机制,解释了为何添加索引能提升查询效率。索引如同数据库的“目录”,在数据量庞大时提高查询速度。文中介绍了常见索引数据结构:哈希表、有序数组和搜索树(包括二叉树、平衡二叉树、红黑树、B-树和B+树)。重点分析了B+树在MyISAM和InnoDB引擎中的应用,并讨论了聚簇索引、非聚簇索引、联合索引及最左前缀原则。最后,还介绍了LSM-Tree在高频写入场景下的优势。通过对比多种数据结构,帮助理解不同场景下的索引选择。
65 6
|
29天前
|
SQL 关系型数据库 MySQL
案例剖析:MySQL唯一索引并发插入导致死锁!
案例剖析:MySQL唯一索引并发插入导致死锁!
案例剖析:MySQL唯一索引并发插入导致死锁!
|
23天前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
56 3
Mysql(4)—数据库索引
|
17天前
|
存储 关系型数据库 MySQL
如何在MySQL中进行索引的创建和管理?
【10月更文挑战第16天】如何在MySQL中进行索引的创建和管理?
41 1
|
6天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
38 0
|
7天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第26天】数据库作为现代应用系统的核心组件,其性能优化至关重要。本文主要探讨MySQL的索引策略与查询性能调优。通过合理创建索引(如B-Tree、复合索引)和优化查询语句(如使用EXPLAIN、优化分页查询),可以显著提升数据库的响应速度和稳定性。实践中还需定期审查慢查询日志,持续优化性能。
34 0
|
1月前
|
监控 关系型数据库 MySQL
MySQL数据表索引命名规范
MySQL数据表索引命名规范
39 1
|
1月前
|
存储 SQL 关系型数据库
mysql中主键索引和联合索引的原理与区别
本文详细介绍了MySQL中的主键索引和联合索引原理及其区别。主键索引按主键值排序,叶节点仅存储数据区,而索引页则存储索引和指向数据域的指针。联合索引由多个字段组成,遵循最左前缀原则,可提高查询效率。文章还探讨了索引扫描原理、索引失效情况及设计原则,并对比了InnoDB与MyISAM存储引擎中聚簇索引和非聚簇索引的特点。对于优化MySQL性能具有参考价值。
|
1月前
|
存储 关系型数据库 MySQL
MySQL中的索引及怎么使用
综上所述,MySQL索引的正确使用是数据库性能调优的关键一环。通过合理设计索引结构,结合业务需求和数据特性,可以有效提升数据库查询响应速度,降低系统资源消耗,从而确保应用的高效运行。
60 1