MySQL:索引02——使用索引

news2024/9/20 21:34:34

目录

引言

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树的对比、页、页的结构、索引分类......

接下来的这篇文章,我将向大家讲解如何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.coloradmin.cn/o/2139886.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CyclicBarrier的源码分析

CyclicBarrier的源码分析 与CountDownLatch、Semaphore直接基于AQS实现不同,CyclicBarrier 是基于 ReentrantLock ConditionObject 实现的,间接基于AQS实现的。 CyclicBarrier内部结构 Generation,静态内部类,持有布尔类型的属…

一、机器学习算法与实践_01基本概念与项目流程笔记

0、机器学习基本概念 机器学习(machine learning)采用算法和统计模型,使计算机系统能够在大量数据中找到规律,然后使用能识别这些模式(规律、趋势或结构)的模型来预测或描述新的数据 1、机器学习相关术语 …

illustrator插件大全 免费插件介绍 Ai设计插件集合 (2)

12、Ai Toolbox 图层名称选择插件 支持AI CC2018-2022-2024 Ai Toolbox for Illustrator — Conical Labels, Bulk Rename and moreAi Toolbox is a plugin for Adobe Illustrator that makes conical labels, provides bulk artboards and paths renaming, selecting by name…

RK3568部署DOCKER启动服务器失败解决办法

按照上文的方法部署完DOCKER之后,启动服务异常,查阅网络相关资源,解决方案如下: 修改/源码/kernel/arch/arm64/configs/OK3568-C-linux_defconfig,在最后添加 CONFIG_MEMCGy CONFIG_VETHy CONFIG_BRIDGEy CONFIG_BRID…

Radware 报告 Web DDoS 攻击活动

新一代 HTTPS 洪水攻击的频率和强度急剧增加,攻击者引入的复杂程度也在迅速提高。2024 年上半年,Web 分布式拒绝服务 (DDoS) 攻击的频率和强度显著增加。其中很大一部分活动可以归因于受政治紧张局势驱使的黑客活动分子。 众所周知,当今的黑…

俄罗斯方块——C语言实践(Dev-Cpp)

目录 1、创建项目(尽量不使用中文路径) 2、项目复制 3、项目配置 ​1、调整编译器 2、在配置窗口选择参数标签 3、添加头文件路径和库文件路径 4、代码实现 4.1、main.c 4.2、draw.h 4.3、draw.c 4.4、shape.h 4.5、shape.c 4.6、board.h 4.7、board.c 4.8、cont…

ip映射域名,一般用于mysql和redis的固定映射,方便快捷打包

举个例子 192.168.3.101mysql映射到mysql.smartlink.com 192.168.3.101redis redis.smartlink.com 要将IP地址映射到域名,可以通过几种方式实现,包括修改本地主机文件(仅适用于本地开发环境)、设置DNS解析(适用于生产环…

安卓玩机工具-----无需root权限 卸载 禁用 删除当前机型app应用 ADB玩机工具

ADB玩机工具 ADB AppControl是很实用的安卓手机应用管理工具,无需root权限,通过usb连接电脑后,可以很方便的进行应用程序安装与卸载,还支持提取手机应用apk文件到电脑上,此外还有手机系统垃圾清理、上传文件等…

Linus 强势拍板 6.11 合入: BPF 赋能调度器终成正果

本文地址:https://www.ebpf.top/post/bpf_sched_ext 1. 插拔调度器的萌芽【2004 年】 在 2004 年,Linux 社区的 Con Kolivas 提出了可插拔式调度器想法,旨在让内核中存在多个调度器,用户可在引导时选择。提交 patch 的工作原理是…

chapter14-集合——(List-Hashtable)——day18

目录 540-Hashtable使用 542-Properties 543-集合选型规则 544-TreeSet源码解读 546-Collections工具类 547-Collections工具类2 540-Hashtable使用 542-Properties 543-集合选型规则 544-TreeSet源码解读 这里讲错了,无参构造是默认调用添加对象的compareTo方法进行排序!…

南京工业大学《2020年+2021年820自动控制原理真题》 (完整版)

本文内容,全部选自自动化考研联盟的:《25届南京工业大学820自控考研资料》的真题篇。后续会持续更新更多学校,更多年份的真题,记得关注哦~ 目录 2020年真题 2021年真题 Part1:20202021年完整版真题 2020年真题 202…

CF 231 E Cactus 题解(仙人掌图上找环)

codeforces 提交记录 题意 有一个点仙人掌图(每个点都只属于至多一个简单环),给出 k k k 个询问,问点 x x x 到点 y y y 有多少条简单路径(经过的边不能重复,点可以)。 思路 一看这个样例…

八、垃圾收集器G1ZGC详解

文章目录 G1收集器(-XX:UseG1GC)ZGC收集器(-XX:UseZGC)ZGC目标ZGC内存布局NUMA-awareZGC运作过程颜色指针颜色指针的三大优势读屏障ZGC存在的问题ZGC参数设置 如何选择垃圾收集器安全点与安全区域 G1收集器(-XX:UseG1GC) G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要…

【开源分享】vsomeip 安装、编译、运行步骤笔记

文章目录 1. 摘要2. 安装、编译2.1 开发环境说明2.2 安装依赖2.3 获取代码2.4 编译代码2.5 安装 3. 测试验证参考 1. 摘要 本文主要描述 vsomeip 的安装、编译与运行步骤。下载源码,安装必要依赖,如Boost和CMake。通过CMake配置编译 vsomeip 库&#xf…

fpga系列 HDL:全连接层的浮点数乘法器FM实现

此代码实现了一个简单的浮点数乘法器,处理两个32位的单精度浮点数。它通过将两个浮点数的有效数字部分进行乘法操作,并对结果进行规范化以生成最终的浮点乘积。 主要逻辑与电路 去掉指数对齐部分后的主要逻辑电路图示: 代码 // https://…

海豚调度器DolphinScheduler--单机版DolphinScheduler 入门到实践:从部署到使用

Apache DolphinScheduler 是一个强大的分布式工作流任务调度系统,它以易用性和强大的功能在数据处理领域脱颖而出。本文将从部署到使用,详细介绍 DolphinScheduler 的各个方面,帮助您快速上手并有效利用这一工具。 一、DolphinScheduler 概述…

mac中git操作账号的删除

命令行玩的很溜的可以跳过 找到钥匙串访问 搜github、gitee就行了

k8s的NodeIP、PodIP、ClusterIP、ExternalIP

1.NodeIP K8s集群由Master Node与Worker Node组成。 Node:组成k8s集群的机器,可以是物理机或虚拟机。 Master Node :管理节点也叫控制平面主要负责管理控制方面。 Worker Node::工作节点用于部署处理业务的工作负载或p…

【计算机网络】IP, 以太网, ARP, DNS

IP, 以太网, ARP, DNS IP协议回顾IP地址报文格式功能介绍地址管理IP地址数量问题初识 NAT 机制通信机制IP数量的解决方案网段划分特殊IP地址 路由选择 以太网协议报文格式源MAC/目的MACMAC地址是什么MAC地址格式MAC的作用 ARPDNS初识DNSDNS主要功能DNS的查询过程 IP协议 回顾I…

协同过滤算法商品推荐系统设计与实现

协同过滤算法商品推荐系统设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装协同过滤算法商品推荐…