MYSQL之索引语法与使用

索引分类

分类               含义                                                     特点                                         关键字

主键索引    针对表中主键创建的索引                    默认自动创建,只能有一个          PRIMARY

唯一索引    避免同一个表中某数据列中的值重复  可以有多个                                   UNIQUE

常规索引    快速定位特定数据                               可以有多个        

全文索引    全文索引查找的是文本中的关键词      可以有多个                                   FULLTEXT

在InnoDB存储引擎中,根据索引的存储形式,又可分为以下两种:

分类                含义                特点            

聚焦索引    将数据存储与索引放到了一块,索引结构地 叶子节点保存了行数据    有且仅能有一个

二级索引    将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键     可以存在多个

聚焦索引选取规则:

如果存在主键,主键索引就是聚焦索引

如果不存在主键,将使用第一个唯一索引作为聚焦索引

如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚焦索引

select * form user where name=“Arm”;

利用二级索引找到对应聚焦索引(回表查询)然后找到对应数据

思考:

1、以下SQL语句,哪个执行效率高?为什么?

select * from user where id =10;

select * from user where name =‘arm’;

备注:id为主键,name字段创建的有索引

答:第一个语句执行效率高,因为执行第二个语句name字段是二级索引,还需要回表检索到聚焦索引,才能找到对应的数据。

2、InnoDB主键索引的B+Tree高度有多高?

假设:

一行数据的大小为1KB,一页(16K)中可以存储16行这样的数据。InnoDB的指针占用6个字节的空间,主键即使是bigint,占用的字节数为8。

树的高度为2可以存储的:

n*8+(n+1)*6=1024*16

主键:n = 1170

指针:n+1=1171

存储量(KB)1171*16=18736KB

树的高度为3可以存储:

1171*1171*16=21939856KB=21426MB=21GB

索引语法

创建索引

语法:

CREATE [UNIQUE|FULLTEXT]INDEX 索引名 ON 表名(被索引列名...);

案例

1、name字段为姓名字段,该字段的值可能会重复,为该字段创建索引

CREATE INDEX ON user1(name1);

2、phone手机号字段的值,是非空,且唯一,为该字段创建唯一索引

CREATE UNIQUE INDEX index_to_phone ON user1(phone);

3、为profession、age、status创建联合索引

CREATE INDEX idx_user_pro_age_sta  ON user1(profession,age,status);

4、为Email建立合适的索引来提升查询的效率

CREATE INDEX index_user_email ON user1(email);

查看索引

查看当前表所具有的索引:

show index from 表名;

删除索引

删除索引:

DROP INDEX 索引名 ON 表名;

SQL性能分析

SQL执行频率

MYSQL客户端连接成功后,通过show[session|global]status命令可以提供服务器状态信息。

通过如下指令可以查看当前数据库的insert,update,delete,select的访问频次:

SHOW GLOBAL STATUS LIKE 'Com_______';

慢查询日志

慢查询日志记录所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志。MYSQL的慢查询日志默认并没有开启,需要在MYSQL的配置文件:

C:\ProgramData\MySQL\MySQL Server 8.0\my.ini

找到指定文件内,修改图下信息:

配置完成之后,通过以下指令重启MYSQL服务器进行测试,查看慢日志文件中记录的信息:C:\ProgramData\MySQL\MySQL Server 8.0\Data\**-slow.log

profiles详情

show profiles能够在做SQL优化时帮助我们了解时间都耗费到哪里去了。通过have_profiling参数,能够看到是否支持profiles,yes是支持。

select @@have_profiling;

默认profiling默认是关闭的,通过set语句在session/global级别开启profiling

查询是否开启:select

0关闭1开启

设置开启

set @@profiling=1;

然后执行一系列sql语句之后

通过

show profiles;

查看各个sql语句的耗时。

查询SQL语句在各个阶段执行耗时情况

show profiles for query query_id;

查询指定query_id的SQL语句CPU的使用情况

show profiles cpu for query query_id;

explain执行计划

explain执行计划各字段的含义:

explain sql语句

索引的使用

验证索引效率

在未创建索引之前,执行SQL语句查看SQL的耗时

select * from tb_sku where sn ='10000002258';

耗时20.03s

针对字段创建索引

create index idx_sku_sn on tb_sku(sn);

然后再次执行相同的SQL语句,再次查看SQL的耗时情况。

select * from tb_sku where sn ='10000002258';

耗时0.00s

使用原则

索引失效
最左前缀法则

如果索引了多列(联合索引),要遵守最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列。如果跳过某一列,索引将部分失效(后面的字段索引失效)。

create full_text index idx_pro_age_sta on tb_user(profession,age,status);
# 走索引
explain select * from tb_user where profession="软件工程" and age=31 and status="0";
# 走索引
explain select * from tb_user where profession="软件工程" and age=31;
# 走索引
explain select * from tb_user where profession="软件工程";
# 走索引 status失效
explain select * from tb_user where profession="软件工程" and status="0";
# 不走索引
explain select * from tb_user where age=31 and status="0";
# 不走索引
explain select * from tb_user where status="0";
范围查询

联合索引中,出现范围查询(>,<),范围查询右侧的列索引失效(规避办法加上>=)

# age后索引失效
explain select * from tb_user where profession="软甲工程" and age>60 and status='0';
# 规避办法
explain select * from tb_user where profession="软甲工程" and age>=60 and status='0';
索引列运算操作

不要在索引列进行运算操作,索引将失效

explain select * from tb_user where substring(phone,10,2)='15';
字符串类型不加引号

字符串类型的字段使用时,不加引号,索引将失效

explain select * from tb_user where profession="软甲工程" and age>=60 and status='0';
# status索引失效
explain select * from tb_user where profession="软甲工程" and age>=60 and status=0;
模糊查询

如果仅仅是尾部模糊匹配,索引不会失效,如果是头部模糊匹配,索引失效。

# 走索引
explain select * from tb_user where profession="软甲工程";
# 走索引
explain select * from tb_user where profession like "软甲%" ;
# 不走索引
explain select * from tb_user where profession like "%工程";
or连接的条件

用or分隔开的条件,如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引豆瓣不会被用到。

解决办法:针对or条件后的字段建立索引

数据分布影响

如果MYSQL评估使用索引比全表更慢,则不使用索引

# 走全表扫描
select * from tb_user where phone>='190000005'
# 走索引
select * from tb_user where phone>='190000015'
SQL提示

SQL提示,是优化数据库的一个重要手段,简单来说,就是在SQL语句中加入一些人为的提示来达到优化操作的目的。

use index(给个建议)

explain select * from tb_user use index(idx_user_pro) where profession="软件工程";

ignore index(忽略)

explain select * from tb_user ignore index(idx_user_pro) where profession="软件工程";

force index(强制)

explain select * from tb_user force index(idx_user_pro) where profession="软件工程";
覆盖索引

尽量使用覆盖索引(查询使用了索引,并且要返回的列能在该索引中全部找到),减少select*(要回表查询,使性能下降)

注意:

using index condition:查找使用了索引,但需要回表查询数据

usingwhere;using index:查找使用了索引,但需要的数据在索引列能找到,不需要回表查询

思考题:

建立一个包含 username和password的联合索引

前缀索引

单列索引和联合索引

单列索引:一个索引包含一个列

联合索引:一个索引包含多个列

在业务场景中,如果存在多个查询条件,考虑针对查询字段建立索引时,建立联合索引,而非单列索引。

单列索引可能会回表查询

联合索引情况

设计原则

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/243846.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Gateway+Springsecurity+OAuth2.0+JWT 实现分布式统一认证授权!

目录 1. OAuth2.0授权服务 2. 资源服务 3. Gateway网关 4. 测试 在SpringSecurityOAuth2.0 搭建认证中心和资源服务中心-CSDN博客 ​​​​​​ 基础上整合网关和JWT实现分布式统一认证授权。 大致流程如下&#xff1a; 1、客户端发出请求给网关获取令牌 2、网关收到请求…

Golang 中如何实现 Set

在Go编程中&#xff0c;数据结构的选择对解决问题至关重要。本文将探讨如何在 GO 中实现 set 和 bitset 两种数据结构&#xff0c;以及它们在Go中的应用场景。 Go 的数据结构 Go 内置的数据结构并不多。工作中&#xff0c;我们最常用的两种数据结构分别是 slice 和 map&#…

K8S--安装Nginx

原文网址&#xff1a;K8S--安装Nginx-CSDN博客 简介 本文介绍K8S安装Nginx的方法。 1.创建Nginx目录及配置文件 mkdir -p /work/devops/k8s/app/nginx/{config,html} 在config目录下创建nginx.conf配置文件&#xff0c;内容如下&#xff1a; # events必须要有 events {wo…

jdk的安装和Tomcat的安装

jdk的安装 双击jdk&#xff0c;然后一路下一步 公共JRE可以关闭&#xff0c;没多大用&#xff0c;反而会占用内存 计算机–>属性–>高级系统设置–>环境变量 系统变量–新建 JAVA_HOMEjdk的存放路径 修改path 在path的最后面添加&#xff08;&#xff1b;%JAVA_H…

即插即用篇 | UniRepLKNet:用于音频、视频、点云、时间序列和图像识别的通用感知大卷积神经网络 | DRepConv

大卷积神经网络(ConvNets)近来受到了广泛研究关注,但存在两个未解决且需要进一步研究的关键问题。1)现有大卷积神经网络的架构主要遵循传统ConvNets或变压器的设计原则,而针对大卷积神经网络的架构设计仍未得到解决。2)随着变压器在多个领域的主导地位,有待研究ConvNets…

【漏洞复现】SpringBlade export-user接口SQL注入漏洞

文章目录 前言声明一、SpringBlade系统简介二、漏洞描述三、影响版本四、漏洞复现五、修复建议 前言 SpringBlade 是一个由商业级项目升级优化而来的微服务架构 采用Spring Boot 2.7 、Spring Cloud 2021 等核心技术构建&#xff0c;完全遵循阿里巴巴编码规范。提供基于React和…

PowerShell install 一键部署grafana

grafana 前言 Grafana 是一款开源的数据可视化和监控仪表盘工具。它提供了丰富的数据查询、可视化和报警功能,可用于实时监控、数据分析和故障排除等领域。 通过 Grafana,您可以连接到各种不同的数据源,包括时序数据库(如 Prometheus、InfluxDB)和关系型数据库(如 MySQ…

Halcon基于形状的模板匹配inspect_shape_model

Halcon基于形状的模板匹配 基于形状的匹配&#xff0c;就是使用目标对象的轮廓形状来描述模板。Halcon中有操作助手&#xff0c;可以直观 地进行形状模板匹配的参数选择以及效果测试。如果使用算子编写&#xff0c;步骤如下。 &#xff08;1&#xff09;从参考图像上选择检测的…

c++:string相关的oj题(415. 字符串相加、125. 验证回文串、541. 反转字符串 II、557. 反转字符串中的单词 III)

文章目录 1. 415. 字符串相加题目详情代码1思路1代码2思路2 2. 125. 验证回文串题目详情代码1&#xff08;按照要求修改后放到新string里&#xff09;思路1代码2(利用双指针/索引)思路2 3. 541. 反转字符串 II题目详情代码1思路1 4. 557. 反转字符串中的单词 III题目详情代码1&…

CocoaPods的安装和使用

前言 本篇文章讲述CocoaPods的安装和使用 安装cocoaPods 如果电脑没有安装过cocoaPods&#xff0c;需要先安装&#xff0c;使用下面的命令&#xff1a; sudo gem install cocoapods输入密码后开始安装&#xff0c;需要等待。。。但是我这里报错了。 The last version of d…

nexus清理docker私库

下载nexus-cli客户端&#xff0c;并非必须下载到服务器&#xff0c;理论上只要能访问到nexus就行 wget https://s3.eu-west-2.amazonaws.com/nexus-cli/1.0.0-beta/linux/nexus-cli这个链接下载不了了&#xff0c;末尾有资源下载&#xff0c;里面包含了完整包和脚本&#xff0…

即插即用篇 | YOLOv8 引入 SENetv2 | 多套版本配合使用

卷积神经网络(CNNs)通过提取空间特征并在基于视觉的任务中实现了最先进的准确性,彻底改变了图像分类。所提出的压缩激励网络模块收集输入的通道表示。多层感知机(MLP)从数据中学习全局表示,在大多数用于学习图像提取特征的图像分类模型中起到关键作用。在本文中,我们引入…

npm ,yarn 更换使用国内镜像源,阿里源,清华大学源

在平时开发当中&#xff0c;我们经常会使用 Npm&#xff0c;yarn 来构建 web 项目。但是npm默认的源的服务器是在国外的&#xff0c;如果没有梯子的话。会感觉特别特别慢&#xff0c;所以&#xff0c;使用国内的源是非常有必要的。 Nnpm&#xff0c; yarn 常用命令 常用命令&am…

Appium 环境配置

Appium 是一个开源的、跨平台的测试框架&#xff0c;可以用来测试 Native App、混合应用、移动 Web 应用&#xff08;H5 应用&#xff09;等&#xff0c;也是当下互联网企业实现移动自动化测试的重要工具。Appium 坚持的测试理念&#xff1a; •无需用户对 App 进行任何修改或…

opencv#27模板匹配

图像模板匹配原理 例如给定一张图片&#xff0c;如上图大矩阵所示&#xff0c;然后给定一张模板图像&#xff0c;如上图小矩阵。 我们在大图像中去搜索与小图像中相同的部分或者是最为相似的内容。比如我们在图像中以灰色区域给出一个与模板图像尺寸大小一致的区域&#xff0c;…

软考系分之计算机网络规划设计、综合布线、RAID和网络存储等

文章目录 1、概要2、网络的三层模型3、综合布线系统4、廉价磁盘冗余阵列&#xff08;RAID&#xff09;5、网络存储6、总结 1、概要 本篇重点介绍计算机网络中的网络规划设计、综合布线、RAID和网络存储。 2、网络的三层模型 三层模型分为核心层、汇聚层和接入层&#xff0c;接…

数组A[m+n]中存放了两个线性表(a1,a2,.....am)和(b1,b2.....bn),将数组中的两个线性表的位置互换,要求空间复杂度为1

要求空间复杂度为O(1)&#xff0c;那么不可以借助辅助数组来完成此操作 算法思路&#xff1a;可先将此数组逆置变成bn,......b1,am,....,a1&#xff0c;然后分别逆转两个线性表的数据元素 算法实现 1、定义一个函数&#xff0c;该函数的功能是可以对一个数组的任意连续的部分进…

UDP和TCP代理协议有什么区别?哪个更好

在互联网的世界里&#xff0c;数据传输的方式有很多种&#xff0c;其中 UDP 和 TCP 是两种常见的传输协议。而代理协议则是为了在网络中传输数据时提供安全、稳定和高效的传输环境。那么&#xff0c;UDP 和 TCP 代理协议有什么区别呢&#xff1f;哪个更好呢&#xff1f;接下来&…

内网穿透的应用-使用Docker搭建一个Wiki.Js知识库系统并实现分享他人远程创作

文章目录 1. 安装Docker2. 获取Wiki.js镜像3. 本地服务器打开Wiki.js并添加知识库内容4. 实现公网访问Wiki.js5. 固定Wiki.js公网地址 不管是在企业中还是在自己的个人知识整理上&#xff0c;我们都需要通过某种方式来有条理的组织相应的知识架构&#xff0c;那么一个好的知识整…

力扣移掉k位数字402

Problem: 402. 移掉 K 位数字 给你一个以字符串表示的非负整数 num 和一个整数 k &#xff0c;移除这个数中的 k 位数字&#xff0c;使得剩下的数字最小。请你以字符串形式返回这个最小的数字。 示例 1 &#xff1a; 给你一个以字符串表示的非负整数 num 和一个整数 k &…