MySQL:索引02——使用索引

news/2024/9/19 12:16:54 标签: mysql, 数据库, database

目录

引言

1、自动创建索引

 2、手动创建索引

2.1 主键索引

2.2 查看索引信息

2.3 唯一索引

2.4 普通索引

2.5 复合索引

 3、删除索引

3.1 主键索引

3.2 其他索引

4、查看执行计划

 4.1 不加条件,查询所有

4.2 使用主键查询

4.3 子查询使用索引

4.4 普通索引

4.5 复合索引


引言

在上篇文章中,详细介绍了有关索引的理论性知识,包含了索引底层的数据结构B+树、B+树与B树的对比、页、页的结构、索引分类......

数据库索引底层数据结构之B+树&MySQL中的页&索引分类【纯理论干货,面试必备】-CSDN博客

接下来的这篇文章,我将向大家讲解如何SQL使用索引。


1、自动创建索引

  •  当我们在表中为字段创建主键约束(PRIMARY KEY),唯一约束(UNIQUE),外检约束(FOREIGN KEY)时,MySQL就会为表中相应的列就会自动创建索引。
  • 如果表中没有指定任何索引时,MySQL会自动为每一列生成一个索引并用 ROW_ID 进行标识(隐藏的,无法查看且无法使用)


 2、手动创建索引

2.1 主键索引

创建主键索引的方式有三种:

  1. 在创建表时就直接创建主键
  2. 在创建表时单独指定主键列
  3. 创建完表后再添加主键列
-- 在创建表时就直接创建主键
CREATE TABLE t_pk1 (
id BIGINT PRIMARY KEY auto_increment,
name VARCHAR(50)
);

-- 在创建表时单独指定主键列
CREATE TABLE t_pk2 (
id BIGINT auto_increment,
name VARCHAR(50),
PRIMARY KEY (id)
);

-- 创建完表后再添加主键列
CREATE TABLE t_pk3 (
id BIGINT,
name VARCHAR(50)
);
ALTER TABLE t_pk3 add PRIMARY KEY (id);
ALTER TABLE t_pk3 MODIFY id BIGINT auto_increment;

使用ALTER修改表内容,语法如下:

 alter table 表面 add|modify|drop 要修改的内容;

2.2 查看索引信息

创建完索引后,我们可以查看索引信息:

  1. desc 表名;//查看索引的简要信息
  2. show index from 表名;
  3. show keys from 表名;

主键索引的名称默认为PRIMARY。 


2.3 唯一索引

创建唯一索引的方式同样有三种:

  1. 在创建表时就直接指定唯一约束
  2. 在创建表时单独指定唯一约束
  3. 创建完表后再添加唯一约束
-- 在创建表时就直接指定唯一约束
CREATE TABLE t_uniq1(
id BIGINT PRIMARY KEY auto_increment,
NAME VARCHAR(50) UNIQUE
);

-- 在创建表时单独指定唯一约束
CREATE TABLE t_uniq2(
id BIGINT PRIMARY KEY auto_increment,
NAME VARCHAR(50),
UNIQUE (NAME)
);

-- 创建完表后再添加唯一约束
CREATE TABLE t_uniq3(
id BIGINT PRIMARY KEY auto_increment,
NAME VARCHAR(50)
);
ALTER TABLE t_uniq3 add UNIQUE (NAME);

创建完后可以查看索引信息:


2.4 普通索引

创建普通索引(索引)的方式有三种:

  1. 创建表时创建索引列
  2. 创建完表后使用alter创建索引
  3. 创建完表后使用 create index 索引名 on 表名(列名,...) 创建索引并指定索引名【最常用,可指定索引名】

 使用 create index 索引名 on 表名(列名[列名, ...])  为创建索引最常用的语法形式,且索引名推荐指定为 索引类型_表名_索引列 的形式。

-- 创建表时创建索引列
CREATE TABLE t_index1(
id BIGINT PRIMARY KEY auto_increment,
NAME VARCHAR(50),
INDEX (NAME)
);

-- 创建完表后使用alter创建索引
CREATE TABLE t_index2(
id BIGINT PRIMARY KEY auto_increment,
NAME VARCHAR(50)
);
ALTER TABLE t_index2 add INDEX (name);

-- 创建完表后使用create index创建索引并指定索引名【最常用,可指定索引名】
CREATE TABLE t_index3(
id BIGINT PRIMARY KEY auto_increment,
name VARCHAR(50)
);
CREATE INDEX idx_t_index3_name on t_index3(name);


2.5 复合索引

复合索引的创建语法与创建普通索引相同,只不过指定多个列,列与列之间用逗号隔开:

  1. 创建表时指定复合索引列
  2. 创建完表后使用alter创建复合索引
  3. 创建完表后使用 create index 索引名 on 表名(列名,...) 创建索引并指定索引名【最常用,可指定索引名】
-- 创建表时指定复合索引列
CREATE TABLE t_index4(
id BIGINT PRIMARY KEY auto_increment,
NAME VARCHAR(50),
sn VARCHAR(50),
INDEX (NAME, sn)
);	

-- 创建完表后使用alter创建索引
CREATE TABLE t_index5(
id BIGINT PRIMARY KEY auto_increment,
NAME VARCHAR(50),
sn VARCHAR(50)
);
ALTER TABLE t_index5 add INDEX (name, sn);

-- 创建完表后使用create index创建索引并指定索引名【最常用,可指定索引名】
CREATE TABLE t_index6(
id BIGINT PRIMARY KEY auto_increment,
name VARCHAR(50),
sn VARCHAR(50)
);
CREATE INDEX idx_t_index6_name_sn on t_index6(name, sn);#指定索引名


 3、删除索引

3.1 主键索引

因为主键索引是在我们创建主键约束时就自动创建的,不是我们手动人为指定的,并且主键索引只有一个,故删除主键索引语法如下:

alter table 表名 drop PRIMARY KEY; //删除主键索引的同时,删除主键约束 

删除主键索引,需要注意一点:

  • 主键列不能定义为auto_increment(自增类型),否则无法删除主键索引
  • 如果主键列是自增类型,需要先修改掉自增类型,再进行主键索引的删除
  • 修改掉主键的自增类型:alter table t_pk1 modify id bigint;

 当然,如果主键不含自增类型,则可直接用 alter table t_pk1 modify id bigint 来删除主键索引。


3.2 其他索引

语法:alter table 表名 drop index 索引名;


4、查看执行计划

对于很多小白来说,虽然自己创建了索引,但不清楚自己写出的SQL到底走没走索引,接下来我将为大家介绍一个关键字(查看执行计划):explain。 

在explain后加上我们写出的SQL语句,就能够查看该条语句的执行计划,判断到底走没走索引。

接下来的操作,我们均在student表中演示,先为name和sn列添加复合索引: 

 4.1 不加条件,查询所有

当我们直接使用 select * from student 时,此时为全表扫描(不走索引)。

我们可以使用explain select * from student;查看执行计划,发现type列中为ALL,说明该SQL没有走索引,是全表扫描得出的结果(效率低)。在生产环境中,如果出现了这样的情况(type为ALL),此时我们就要考虑为该列加索引了。

4.2 使用主键查询

当我们使用主键索引进行查询时,很显然会走索引,根据主键索引树,会很快的查询到目标值(主键索引树中包含所有的数据)。

使用explain查看执行计划时,type为const,代表查询效率为常量级别,非常的快,说明走索引。

 4.3 子查询使用索引

4.4 普通索引

当我们要查询的列包含在索引中时,会发生索引覆盖,此时不需要回表查询。

当要查询的列不完全包含在索引中时,会发生回表查询。

Extra列若为:Using index ,则表示索引覆盖。

4.5 复合索引

因为sn列创建了唯一索引,为了避免影响复合索引的查询,先drop掉复合索引sn。 接下来,我们再来查看复合索引的执行计划:

我们创建的复合索引为index(name,sn),name为复合索引的第一列,即name在前,sn在后,故使用name查询sn时,走索引,发生索引覆盖:

 但是若使用sn来查name,则不走索引:

当出现了Using where,说明可能进行了全表扫描(不走索引),这时我们就需要判断我们的SQL语句是不是出现了问题,对SQL做出优化。

  • Extra:执行情况的说明和描述。包含不适合在其他列中显示但十分重要的额外信息。
  • Using index:表示使用索引,如果只有 Using index,说明他没有查询到数据表,只用索引表就完成了这个查询,即发生索引覆盖。
  • Using where:表示条件查询,如果不读取表的所有数据,或不是仅仅通过索引就可以获取所有需要的数据,则会出现 Using where(可能有全表扫描的情况)。

注意,当使用AND或其他情况下,只要where条件中使用了索引包含的所有列,就会走索引,和顺序无关:


END


http://www.niftyadmin.cn/n/5662512.html

相关文章

7天速成前端 ------学习日志 (继苍穹外卖之后)

前端速成计划总结: 全26h课程,包含html,css,js,vue3,预计7天内学完。 起始日期:9.16 预计截止:9.22 每日更新,学完为止。 学前计划 课…

苍穹外卖 修改nginx的端口后websocket连接失败解决

苍穹外卖 修改nginx的端口后websocket连接失败解决 问题: 后端配置好websocket后前端仍显示如图所示的错误 解决: 先用websocket在线工具测试后端是否能正常连接(这个基本上不会出现问题)用f12观察前端发送的请求 正常来说这个请…

【电路笔记】-差分运算放大器

差分运算放大器 文章目录 差分运算放大器1、概述2、差分运算放大器表示2.1 差分模式2.2 减法器模式3、差分放大器示例3.1 相关电阻3.2 惠斯通桥3.3 光/温度检测4、仪表放大器5、总结1、概述 在之前的文章中,我们讨论了反相运算放大器和同相运算放大器,我们考虑了在运算放大器…

数模原理精解【11】

文章目录 logistic模型多元回归分析多元回归分析概览1. 多元回归的概念与重要性2. 多元回归在实际应用中的例子3. 多元回归在预测和解释数据中的优势和局限性4. 多元回归的优缺点及改进建议 多元线性回归分析详解一、原理二、性质三、计算四、例子与例题五、应用场景六、优缺点…

1分钟解决 -bash: mvn: command not found,在Centos 7中安装Maven

1分钟解决 -bash: mvn: command not found,在Centos 7中安装Maven 检查Java环境1 下载Maven2 解压Maven3 配置环境变量4 验证安装5 常见问题与注意事项6 总结 检查Java环境 Maven依赖Java环境,请确保系统已经安装了Java并配置了环境变量。可以通过以下命…

基于yolov8的无人机检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的无人机检测系统是一项前沿技术,结合了YOLOv8深度学习模型的强大目标检测能力与无人机的灵活性。YOLOv8作为YOLO系列的最新版本,在检测精度和速度上均有显著提升,特别适用于复杂和高动态的场景。 该系统通过捕获实…

【CMake】使用CMake在Visual Studio 构建多cpp文件项目

首先,我们在 C m a k e Cmake Cmake文件下写入以下代码: #需求的最低cmake程序版本 cmake_minimum_required(VERSION 3.12)#本工程的名字 project(OpenGL)#支持的C版本 set(CMAKE_CXX_STANDARD 20)#本工程主程序文件及输出程序名称,生成exe …

unordered_map如何按照second值排序

C中 <unordered_map>是一个无序的关联容器&#xff0c;它不支持直接按值排序&#xff0c;则无法使用<algorithm>中的sort算法进行排序&#xff0c;所以我们可以换个思路&#xff0c;把哈希表中的元素全部提取出来装入<vector>容器中&#xff0c;再排序。 具…