Mysql进阶SQL优化

        SQL优化在开发场景中必不可少的技能之一,它能最大限度的提升SQL查询性能,如果随意使用也会出现不可预料的结局。

1、为什么要优化SQL

        我们先说说不优化SQL造成什么现象。常见问题是响应时间长,用户体验感低。数据库频繁争抢锁,浪费性能。CPU过载,资源消耗高等问题。为了避免这些问题,不能盲目的添加资源,尽可能做到物尽其用。现实生活中不管对于ToC还是ToB,对外核心点:体验感永远是排在第一位,不管系统好坏,一旦体验感不行,都会丧失客户,这也是我们需要去优化SQL的原因之一。

        优化SQL旨在保证提高数据库性能,提升应用程序响应速度,提升体验感。

2、怎么优化SQL

2.1、开启慢查询

a)查看Mysql是否开启慢查询,一般默认没有开启

## 查看慢查询开关命令
show variables like 'slow_query_log';

b)开启慢查询日志

1、在Mysql安装目录中找到my.ini文件

2、添加以下参数:

## 开启慢查询
slow_query_log = 1
## 存放目录
slow_query_log_file = D:\developDoc\slowQueryLog\slowlog.log
## 执行时间超过多少秒(单位秒)就会被记录到慢查询日志中
long_query_time = 1

3、重启Mysql服务。

## windows环境
1、services.msc
2、查询Mysql服务。
3、点击重启即可

## linux环境
systemctl restart mysqld;

4、查询是否开启与存放路径。

b)查询语句(根据自身需求书写SQL)

c)查看慢查询日志

2.2、Profiling耗时分析(非必须)

        后续补充。

2.3、语句分析

        语句分析有两种命令方式:explain(常用),desc(一般用于查看表结构);除了关键字外不一样,其他的都一样。

2.3.1、Explain/Desc

        我们先看看explain执行语句长什么样子。在分析他们之间的关系与含义。

        图中可以看到 id, select_type,table,partitions,type,possible_keys,key,key_len,ref,rows,filtered,extra 这些字段,下面将分开讲述这些字段。

        SQL分析中必须查看 type、possible_keys、key、extra 四列,ken_len 其次,其他的可以根据需求查看。

2.3.1.1、id

        id:序号值,旨在控制执行顺序,值越大越先执行,值相同从上到下执行。

单行时,不用关注id数值,多行顺序值,需要关注执行顺序来分析SQL信息。

例如:

        查询中国银行中有多少用户,并提取用户信息。

select
	*
from
	d_user du
where
	du.user_id in (
	select
		dba.user_id
	from
		d_bank_account dba
	where
		dba.user_id = du.user_id
		and dba.bank_id = (
		select
			db.bank_id
		from
			d_bank db
		where
			db.bank_name = '中国银行')
) and du.id < 3;

        先看看原始SQL后(先心里有一个执行顺序),在配合explain中的序号和别名,看是否一致。 

        中国银行的储蓄用户,第一步:先查询中国银行id。第二部:在查询中国银行id对于的用户id。第三步:根据用户id,查询用户信息。根据步骤可以看出执行顺序:db,dba,du。explain执行顺序:3,2,1。可以看出结论与我们分析的一致,结论成立。

2.3.1.2、select_type

        select_type:搜索类型,常见类型 SIMPLE、PRIMARY、SUBQUERY、DERIVED、UNION等。

具体主要类型分析:

  • Simple(简单类型)
    • 简单的 SELECT 查询,不包含子查询或 UNION
  • PRIMARY(最外层查询)
    • 最外层查询,如果查询中包含任何复杂的子部分,最外层查询则被标记为 PRIMARY
  • SUBQUERY(子查询)
    • 在 SELECT 或 WHERE 列表中包含了子查询。
  • DERIVED
    • 在 FROM 列表中包含的子查询被标记为 DERIVED(衍生),MySQL 会递归执行这些子查询,把结果放在临时表里。
    • 后续补充
  • UNION
    • 如果第二个 SELECT 出现在 UNION 之后,则被标记为 UNION;若 UNION 包含在 FROM 子句的子查询中,外层 SELECT 将被标记为 DERIVED
    • 后续补充
  • UNION RESULT
    • 从 UNION 表获取结果的 SELECT
    • 后续补充
  • DEPENDENT SUBQUERY
    • 在 SELECT 或 WHERE 列表中包含了子查询,子查询基于外层。
    • 后续补充
  • UNCACHEABLE SUBQUERY
    • 无法被缓存的子查询。
    • 后续补充
2.3.1.3、table

        执行SQL所属表。

2.3.1.4、partitions

        匹配的分区信息。如果查询是基于分区表的话,会显示查询将访问的分区

2.3.1.5、type(类型)

        访问类型,如 ALL(全表扫描)、index(全索引扫描)、range(范围扫描)、ref(非唯一索引扫描)、eq_ref(唯一索引扫描),const(常量),system(系统) 等。

        性能从大到小  const > eq_ref > ref > range > index > all。如果Sql类型是 ALL 就必须优化,index 尽可能优化到range。

2.3.1.6、possible_keys

        SQL可能使用的索引,包含零个或多个。

2.3.1.7、key

        SQL使用的索引。

2.3.1.8、key_len

        SQL只用的索引长度。

2.3.1.9、ref

        显示索引的哪一列被使用了,如果可能的话,是一个常数,哪些列或常量被用于查找索引列上的值。

2.3.1.10、rows

        SQL执行影响行数,不是很准确。

2.3.1.11、filtered

        查询的表行占表的百分比。

2.3.1.12、extra

        拓展信息,也是SQL分析最重要的列。

3、常见SQL问题

3.1、未走索引,全表检索

        explain 中 type 显示 ALL 时 是没有走到索引的,具体可查看 key 列。

3.2、分组未走索引

        group by 中的字段没有建立索引,造成extra列显示 Using temporary 信息。

3.2、排序未走索引

        order by 中字段没有走索引。extra列显示 Using filesort 信息

3.3、索引失效

        字段建立索引没有走到。type 值显示 ALL

4、优化策略

4.0、数据结构

CREATE TABLE `d_user` (
  `id` int NOT NULL COMMENT '主键id',
  `user_id` varchar(50) NOT NULL COMMENT '用户id',
  `user_name` varchar(100) NOT NULL COMMENT '用户名',
  `phone` varchar(100) NOT NULL,
  `age` int NOT NULL,
  `gender` tinyint DEFAULT '0' COMMENT '性别',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `test_not_null` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_user_qe_user_id` (`user_id`),
  KEY `idx_phone` (`phone`)
) ENGINE=InnoDB COMMENT='用户信息表';


CREATE TABLE `d_bank` (
  `id` int NOT NULL COMMENT '主键id',
  `bank_id` varchar(50) NOT NULL COMMENT '银行id',
  `bank_name` varchar(50) NOT NULL COMMENT '银行名',
  `address` varchar(255) DEFAULT NULL COMMENT '地址',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='银行表';


CREATE TABLE `d_bank_account` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `account_id` varchar(50) NOT NULL COMMENT '银行卡id',
  `account_no` varchar(50) NOT NULL COMMENT '银行卡编号',
  `account_type` tinyint DEFAULT '0' COMMENT '银行卡类型',
  `bank_id` varchar(50) DEFAULT NULL COMMENT '银行卡id',
  `user_id` varchar(50) DEFAULT NULL COMMENT '持有人',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB comment='用户储蓄账号关系表';

4.1、策略方向

        1、经常搜索列建立索引。2、最左前缀匹配法则。3、索引覆盖。

        我们回顾哈上篇文章的索引:主键索引、唯一索引、普通索引(单列索引、联合索引)、全文索引(一般不用)

        建议:尽可能新建联合索引,少新建单列索引,能走主键索引绝不走唯一索引或普通索引(避免回表查询)。

4.2、问题分析

4.2.0、前序信息

表信息索引信息索引截图数据量
d_user999803
d_bank5
d_bank_account2774925

查看索引语法:

## 查询表索引
## table_name 数据表
show index from table_name;

4.2.1、未走索引现象与优化

案例一:查询手机号='13500000215'用户信息

语句:select * from d_user where phone = '13500000215';

数据:可以看出执行耗时1.5秒

 explain分析:可以看出 type = ALL 且 key = null 没有走索引。

对phone字段添加索引: 

        图中可知:type 由 all 优化为了 ref , key 也使用了刚刚新建索引,整个耗时由 1.5秒提升至 忽略不计。

案例二:查询user_id=4a163cc6e18341698bc9b3a8ce64ee88用户信息

        图中可知:耗时1.5秒左右。

        分析:用户id在整个系统中应该唯一,不可能出现所谓了重复问题,所以对user_id字段添加唯一索引。

 总结:通过上面两个案例可知,走索引与不走索引的性能差异之大,其中唯一索引性能提升最大,type 等于了 const,这也是 SQL优化中 最优解,但是这个类型只有唯一索引与主键索引可以达到,其他的索引最多只能达到eq_ref ,索引优化中常见是 ref 是最优。

4.2.2、走索引缺失效与优化

        索引失效常见有如下几种场景:

4.2.2.1、未走 最左前缀匹配法则,导致索引失效。

        可以看出 age 字段在联合索引中,但是

4.2.2.2、范围查询列之后列,不走索引。
4.2.2.2.1、案例分析

        是否失效需要查看联合索引中各个字段的索引长度:

        a)先看看全匹配联合索引的索引长度:key_len = 408

        b) 查看gender索引长度:408 - 106 = 2

        c)查看age与user_name索引长度:age :408 - 402 = 6。user_name : 402

         从上面三个步骤来看三个字段索引长度,usename = 402, age = 6, gender = 2

 案例一:查看姓名=‘测试用户2’ 且 年龄>20 且 性别=1;

         图中可知:索引长度 = 406 缺少了 gender的索引长度(失效)。

        解决方式:范围查询 更改 范围查询+等值查询。例如: > 更改 >= , < 更改 <=等。

 下图可知:将 > 更改为 >= 后,走全索引。

4.2.2.2.2、结论

         范围查询 需要将 > ,< 更换为 >=, <=来走索引。

4.2.2.3、全模糊或前缀模糊不走索引。
4.2.2.3.1、案例分析

案例一:查询姓名包含测试用户的储蓄用户。

案例二:查询已123结尾的储蓄用户。

4.2.2.3.2、结论

        从上面两个案例来看,对于字符类型的模糊匹配会造成索引失效(不走索引)。

解决方式:采用后缀匹配 即 like 'xxx%';

        图中可知:后缀模糊匹配与等值匹配都走索引,且索引长度一致,除type不一致外。

4.2.2.4、函数计算索引失效。
4.2.2.4.1、案例分析

案例一:查询用户姓名长度大于7的信息

案例二:查询以前2个字符为前缀匹配

4.2.2.4.2、结论

        从上面两个案例来看,对于使用计算函数列无法采用索引。

解决方式:1、创建函数索引(8.0引入)。2、索引覆盖

4.2.2.5、or条件索引失效
4.2.2.5.1、案例分析

案例一:前面条件走索引字段 or 条件字段不是索引字段

案例二:前面条件走索引 or 条件字段索引失效 

4.2.2.5.2、结论

        从上面两个案例可知:一旦 or中某一条件索引失效,整个SQL的索引都失效。

解决方法:or 前后条件都走索引。

5、总结

        本文还未完善,后续会补充 多表关联讲解。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot使用外置的Servlet容器(详细步骤)

嵌入式Servlet容器&#xff1a;应用打成可执行的jar 优点&#xff1a;简单、便携&#xff1b; 缺点&#xff1a;默认不支持JSP、优化定制比较复杂.&#xff1b; 外置的Servlet容器&#xff1a;外面安装Tomcat---应用war包的方式打包&#xff1b; 操作步骤&#xff1a; 方式一&…

基于统计分析与随机森林的环境条件对生菜生长的影响研究

1.项目背景 随着现代农业的发展&#xff0c;对植物生长过程中环境因素的影响有了越来越多的关注&#xff0c;基于2023年8月3日至2023年9月19日期间记录的70个不同生菜样本的生长数据进行分析&#xff0c;可以更好地理解温度、湿度、pH值和总溶解固体&#xff08;TDS&#xff0…

Bitmap(BMP)图像信息分析主要说明带压缩的形式

文章目录 参考资料Bitmap图片结构Bitmap图片组成实例说明 参考资料 微软官方-位图存储 Bitmap图片结构 序号名称说明1Bitmap File HeaderBitmap文件头2Bitmap Info HeaderBitmap信息头3Color Palette Data调色板数据4Bitmap Image Data图像数据 说明 Bitmap文件头的大小为…

百度热力图数据日期如何选择

目录 1、看日历2、看天气 根据研究内容定&#xff0c;一般如果研究城市活力的话&#xff0c;通常会写“非重大节假日&#xff0c;非重大活动&#xff0c;非极端天气等”。南方晴天不多&#xff0c;有小雨或者中雨都可认为没有影响&#xff0c;要不然在南方很难找到完全一周没有…

基于ArcGIS Pro的SWAT模型在流域水循环、水生态模拟中的应用及案例分析;SWAT模型安装、运行到结果读取全流程指导

目前&#xff0c;流域水资源和水生态问题逐渐成为制约社会经济和环境可持续发展的重要因素。SWAT模型是一种基于物理机制的分布式流域水文与生态模拟模型&#xff0c;能够对流域的水循环过程、污染物迁移等过程进行精细模拟和量化分析。SWAT模型目前广泛应用于流域水文过程研究…

【机器学习(九)】分类和回归任务-多层感知机(Multilayer Perceptron,MLP)算法-Sentosa_DSML社区版 (1)111

文章目录 一、算法概念111二、算法原理&#xff08;一&#xff09;感知机&#xff08;二&#xff09;多层感知机1、隐藏层2、激活函数sigma函数tanh函数ReLU函数 3、反向传播算法 三、算法优缺点&#xff08;一&#xff09;优点&#xff08;二&#xff09;缺点 四、MLP分类任务…

tryhackme-Cyber Security 101-Cryptography-Cryptography Basics(加密基础)

目的&#xff1a;了解加密和对称加密的基础知识。 任务1&#xff1a;介绍 你有没有想过如何防止第三方阅读你的消息&#xff1f;您的应用程序 或 Web 浏览器如何与远程服务器建立安全通道&#xff1f;安全是指没有人可以读取或更改交换的数据;此外&#xff0c;我们可以确信我们…

螺杆支撑座在运用中会出现哪些问题?

螺杆支撑座是一种用于支撑滚珠螺杆的零件&#xff0c;通常用于机床、数控机床、自动化生产线等高精度机械设备中。在运用中可能会出现多种问题&#xff0c;这些问题源于多个方面&#xff0c;以下是对可能出现的问题简单了解下&#xff1a; 1、安装不当&#xff1a;安装过程中没…

基于SpringBoot的在线文档管理系统的设计与实现

一、项目背景 随着社会的快速发展&#xff0c;计算机的影响是全面且深入的。员工生活水平的不断提高&#xff0c;日常生活中员工对在线文档方面的要求也在不断提高&#xff0c;在线文档管理受到广大员工的关注&#xff0c;使得在线文档管理系统的开发成为必需而且紧迫的事情。…

UE5 崩溃问题汇总!!!

Using bundled DotNet SDK version: 6.0.302 ERROR: UnrealBuildTool.dll not found in "..\..\Engine\Binaries\DotNET\UnrealBuildTool\UnrealBuildTool.dll" 在你遇到这种极奇崩溃的BUG &#xff0c;难以解决的时候。 尝试了N种方法&#xff0c;都不行的解决方法。…

QML学习(五) 做出第一个简单的应用程序

通过前面四篇对QML已经有了基本的了解&#xff0c;今天先尝试做出第一个单页面的桌面应用程序。 1.首先打开Qt,创建项目&#xff0c;选择“QtQuick Application - Empty” 空工程。 2.设置项目名称和项目代码存储路径 3.这里要注意选择你的编译器类型&#xff0c;以及输出的程…

Dockerfile基础指令

1.FROM 基于基准镜像&#xff08;建议使用官方提供的镜像作为基准镜像&#xff0c;相对安全一些&#xff09; 举例&#xff1a; 制作基准镜像&#xff08;基于centos:lastest&#xff09; FROM cenots 不依赖于任何基准镜像 FROM scratch 依赖于9.0.22版本的tomcat镜像 FROM…

光谱相机的工作原理

光谱相机的工作原理主要基于不同物质对不同波长光的吸收、反射和透射特性存在差异&#xff0c;以下是其具体工作过程&#xff1a; 一、光的收集 目标物体在光源照射下&#xff0c;其表面会对光产生吸收、反射和透射等相互作用。光谱相机的光学系统&#xff08;如透镜、反射镜…

Windows Subsystem for Linux (WSL)

目录 定义与功能 版本与特点 应用场景 启用 WSL 功能 更新WSL及其内核 下载Linux发行版本 WSL&#xff08;Windows Subsystem for Linux&#xff09;是微软在Windows 10和Windows 11中引入的一项功能&#xff0c;使用户能够在Windows上原生运行Linux的命令行工具和应用程…

基于springboot的汽车租赁系统丨源码+数据库+万字文档+PPT

作者简介&#xff1a; 作者&#xff1a;学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等 文末获取“源码数据库万字文档PPT”&#xff0c;支持远程部署调试、运行安装。 技术框架 开发语言&#xff1a;Java 框架&#xff1a;spring…

ECharts仪表盘-GaugeCar,附视频讲解与代码下载

引言&#xff1a; ECharts仪表盘&#xff08;Gauge Chart&#xff09;是一种类似于速度表的数据可视化图表类型&#xff0c;用于展示单个或多个变量的指标和状态&#xff0c;特别适用于展示指标的实时变化和状态。本文将详细介绍如何使用ECharts库实现一个仪表盘&#xff0c;…

Debian安装配置RocketMQ

安装配置 本次安装在/tools/rocket目录下 下载 wget https://dist.apache.org/repos/dist/release/rocketmq/5.3.1/rocketmq-all-5.3.1-bin-release.zip 解压缩 unzip rocketmq-all-5.3.1-bin-release.zip 如果出现以下报错 -bash: unzip: command not found可安装unzip工具后执…

单纯从配色看:飞书B端界面超出大多数B端界面的窠臼。

提及管理系统界面的配色&#xff0c;大家的第一印象就是蓝色&#xff0c;导航栏居左&#xff0c;深蓝色。不是说这种配色和布局不好&#xff0c;而是说看多了就腻歪了&#xff0c;本次分享一些飞书的后台界面&#xff0c;虽说也是左右布局&#xff0c;布局上没有啥突破。 但是…

Jupyter在运行上出现错误:ModuleNotFoundError: No module named ‘wordcloud‘

问题分析&#xff1a;显示Jupyter未安装这个模板 解决办法&#xff1a;在单元格内输入&#xff1a;!pip install wordcloud

《Vue3 二》Vue 的模板语法

在 React 中&#xff0c;想要编写 HTML&#xff0c;是使用 JSX&#xff0c;之后通过 Babel 将 JSX 编译成 React.createElement 函数调用&#xff1b;在 Vue 中&#xff0c;也支持 JSX 的开发模式&#xff0c;但大多数情况下都是使用基于 HTML 的模板语法&#xff0c;在模板中允…