MySQL优化之SQL优化详解

(/≧▽≦)/~┴┴ 嗨~我叫小奥 ✨✨✨
👀👀👀 个人博客:小奥的博客
👍👍👍:个人CSDN
⭐️⭐️⭐️:传送门
🍹 本人24应届生一枚,技术和水平有限,如果文章中有不正确的内容,欢迎多多指正!
📜 欢迎点赞收藏关注哟! ❤️

文章目录

  • MySQL优化之SQL优化详解
  • 优化SQL的步骤
    • 1. 了解SQL执行频率
    • 2. 定位执行效率低的SQL
    • 3. 查看SQL执行的耗时
    • 4. 分析SQL的执行计划
    • 5. 分析优化器如何选择执行计划

MySQL优化之SQL优化详解

在应用的开发过程中,由于初期数据量小,开发人员写SQL语句时更重视功能上的实现,但是当应用系统正式上线后,随着生产数据量的急剧增长,很多SOL语句开始逐渐显露出性能问题,对生产的影响也越来越大,此时这些有问题的SQL语句就成为整个系统性能的瓶颈,因此我们必须要对它们进行优化。

优化SQL的步骤

当面对一个有SOL性能问题的数据库时,我们应该从何处入手来进行系统的分析,使得能够尽快定位问题SOL并尽快解决问题,我将带大家一起学习这个过程。

1. 了解SQL执行频率

MySQL客户端连接成功后,通过show [session|global] status命令可以提供服务器状态信息。通过如下指令,可以查看当前数据库的INSERT、UPDATE、DELETE、SELETE的访问频次:

show global status like 'Com_______';  //注意:七个下划线代表七个字符

在这里插入图片描述

Com_xxx表示每个xxx语句执行的次数,我们比较关心的是以下几个统计参数:

  • Com_select:执行SELECT操作的次数,一次查询只累加1;
  • Com_insert:执行INSERT操作的次数,对于批量插入的INSERT操作,只累加一次;
  • Com_update:执行UPDATE操作的次数;
  • Com_delete:执行DELETE操作的次数。

通过以上几个参数,可以很容易地了解当前数据库的应用是以插入更新为主还是以查询操作为主,以及各种类型的SQL大致的执行比例是多少。对于更新操作的计数,是对执行次数的计数,不论提交还是回滚都会进行累加。.

对于事务型的应用,通过Com_commitCom_rollback可以了解事务提交和回滚的情况对于回滚操作非常频繁的数据库,可能意味着应用编写存在问题。

2. 定位执行效率低的SQL

慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志。

我们可以通过如下命令查询慢查询是否开启:

show variables like 'slow_query_log';

在这里插入图片描述

MySQL的慢查询日志默认没有开启,需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息:

# 开启MySQL慢查询日志开关
slow_query_log=1
# 设置慢日志的时间为2秒。SQL语句的执行时间超过两秒,就会被视为慢查询,记录慢查询日志
long_query_time=2

配置完毕之后,通过以下指令重新启动MySQL服务进行测试,查看慢日志文件中记录的信息 /var/lib/mysql/192-slow.log

systemctl restart mysqld

在这里插入图片描述

我们可以去var/lib/mysql/目录下查看一个名字带-slow.log的日志文件,初始内容为数据库版本信息。

在这里插入图片描述

3. 查看SQL执行的耗时

show profiles能够在做SQL优化时帮助我们了解事件都耗费到哪里去了。通过have_profiling参数,能够看到当前MySQL是否支持profile操作:

select @@have_profiling;

在这里插入图片描述

然后可以通过select @@profiling;查看profile是否开启

select @@profiling;

在这里插入图片描述

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

set profiling=1;

然后我们就可以执行一系列的业务SQL的操作,通过如下指令查看SQL的执行耗时:

# 查看每一条SQL的耗时基本情况
show profiles;
# 查看指定query_id的SQL语句的各个阶段的耗时情况
show profile for query query_id;
# 查看指定query_id的SQL语句CPU的使用情况
show profile cpu for query query_id;

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4. 分析SQL的执行计划

通过以上步骤查询到效率低的 SQL语句后,可以通过 EXPLAIN或者DESC命令获取MySQL 如何执行SELECT 语句的信息,包括在SELECT 语句执行过程中表如何连接和连接的顺序。

# 直接在select语句之前加上关键字explain/desc
EXPLAIN SELECT 字段列表 FROM 表名 WHERE 条件;

在这里插入图片描述

下面简单的介绍一下每个字段的作用:

id

select查询的序列号,表示查询中执行select子句或者是操作表的顺序(id相同,执行顺序从上到下;id不同,值越大,越先执行),如果为null表示这个是一个结果集,不需要用它来进行查询。

select_type

表示SELECT的类型。

取值含义
simple简单的select查询,查询中不包含子查询或者union
primary查询中包含任何复杂的子查询,最外层查询被标记为primary
union若第二个select出现在union之后,则会被标记为union;若union包含在from子句的子查询中,外层select将被标记为derived
dependent union与union一样,出现在union或union all语句中的,但是这个查询要受到外部查询的影响
union result包含在union的结果集,在union和union all语句中,因为它不需要参与查询,所以id字段为null
subquery在select或where列表中包含子查询
dependent subquery与dependent union类似,表示这个subquery的查询主要受到外部表查询的影响
derived在from列表中包含的子查询被标记为derived(衍生),mysql或者递归执行这些子查询,把结果放在临时表里

table

输出结果集的表名,如果查询使用了别名,那么这里显示的是别名。

  • 如果不涉及对数据表的操作,那么这显示为null,
  • 如果显示为尖括号括起来的就表示这个是临时表,后边的N就是执行计划中的id,表示结果来自于这个查询产生。
  • 如果是尖括号括起来的<union M,N>,与类似,也是一个临时表,表示这个结果来自于union查询的id为M,N的结果集。

type

表示连接类型,描述了找到所需数据使用的扫描方式。

性能有好到差的连接类型为null > system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

取值含义
system系统表,少量数据,往往不需要磁盘IO
const常量连接
eq_ref使用索引是唯一索引,对于每个索引键值,表中只有一条记录,即多表连接使用primary key或者 unique index作为关联条件
ref使用非唯一索引扫描或者唯一索引的前缀扫描,返回匹配某个单独值得记录行
ref_or_null与ref方法类型,只是增加了null值的比较
range索引范围扫描,常见于<、<=、>、>=、between等操作符
index索引全扫描,MySQL遍历整个索引来查询匹配的行
index_merge表示查询使用了两个以上的索引,最后取交集或者并集
fulltext全文检索索引
unique_subquery用于where中的in形式子查询,子查询返回不重复唯一的值
index_subquery用于in形式子查询,子查询可能返回重复值,可以使用索引将子查询去重
all全表扫描,MySQL遍历全表来找到匹配的行

possible_key

查询可能涉及在这张表上的索引,一个或多个,但不一定被查询实际使用。

key

实际使用的到索引,如果为null,则说明没有使用索引;查询中如果使用了覆盖索引,则该索引仅出现在key列表中。

key_len

表示索引中使用的字节数,该值为索引字段最大可能长度,并非实际使用长度,在不损失精确性的前提下,长度越短越好。

ref

如果是使用的常量等值查询,这里会显示const,如果是连接查询,被驱动表的执行计划这里会显示驱动表的关联字段,如果是条件使用了表达式或者是函数,或者条件列发生了内部隐式转换,这里可能显示为func。

rows

MySQL认为必须要执行查询的行数,在innodb引擎的表中,是一个估计值,可能并不总是准确的。

filtered

表示返回结果的行数占需读取行数的百分比,filter的值越大越好。

Extra

取值含义举例
Using where说明SQL使用了where条件过滤数据explain select * from table where id > 3
Usering index说明SQL需要返回所有列数据均在一棵索引树,而无需访问实际的行记录explain select id from table
Using index condition说明命中了索引,但是并不是所有列数据都在索引树上,还需要访问实际的行记录explain select * from table t1, table t2 where t1.id= t2.id;
Using filesort说明得到所需结果集,需要对所有记录进行文件排序。比如在一个没有建立索引的列上进行order byexplain select id from table order by name
Using temporary说明需要建立临时表(temporary table)来暂存中间结果。explain select name, count(*) from table group by name order by name;

5. 分析优化器如何选择执行计划

MySQL 5.6提供了对SQL的跟踪trace,通过trace文件能够进一步了解为什么优化器选择A执行计划而不选择B执行计划,帮助我们更好地理解优化器的行为。

使用方式:首先打开trace,设置格式为JSON,设置trace最大能够使用的内存大小,避免解析过程中因为默认内存过小而不能够完整显示。

# 打开trace并设置格式为json
set OPTIMIZER_TRACE = "enabled=0n", END_MARKERS_IN_JSON=on;
# 设置最大内存
set OPTIMIZER_TRACE_MAX_MEM_SIZE = 1000000;

执行完我们想要分析的SQL之后,检查information_schema.OPTIMIZER_TRACE就可以知道MySQL是如何执行SQL的。

select * from information_schema.OPTIMIZER_TRACE;

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

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

相关文章

Laravel01 课程介绍以及Laravel环境搭建

Laravel01 课程介绍 1. Laravel2. mac开发环境搭建(通过Homebrew)3. 创建一个项目 1. Laravel 公司中面临着PHP项目与Java项目并行&#xff0c;所以需要我写PHP的项目&#xff0c;公司用的框架就是Laravel&#xff0c;所以在B站上找了一门课学习。 Laravel中文文档地址 https…

leetcode hot 100最后一块石头重量Ⅱ

在本题中&#xff0c;我们可以知道&#xff0c;是要求最后石头返还的重量&#xff0c;也就是&#xff0c;将整个数组分割成两个子集&#xff0c;求让两个子集的差值最小。这和上一道分割整数集类似&#xff0c;只是需要我们返回差值。所以我们采用动态规划01背包来做&#xff0…

StarRocks加速查询——低基数全局字典

前言 StarRocks-2.0引入了低基数全局字典&#xff0c;可以通过全局字典将字符串的相关操作转换成整型相关操作&#xff0c;极大提升了查询性能。StarRocks 2.0后的版本默认会开启低基数字典优化。 一、低基数字典 对于利用整型替代字符串进行处理&#xff0c;通常使用字典编码…

穿越Redis单线程迷雾:从面试场景到技术内核的解读

目录 ​编辑 前言 Redis中的多线程 I/O多线程 Redis中的多进程 结论 延伸阅读 前言 很多人都遇到过这么一道面试题&#xff1a;Redis是单线程还是多线程&#xff1f;这个问题既简单又复杂。说他简单是因为大多数人都知道Redis是单线程&#xff0c;说复杂是因为这个答案…

Leetcode - 周赛385

目录 一&#xff0c;3042. 统计前后缀下标对 I 二&#xff0c;3043. 最长公共前缀的长度 三&#xff0c;3044. 出现频率最高的质数 四&#xff0c;3045. 统计前后缀下标对 II 一&#xff0c;3042. 统计前后缀下标对 I 该题数据范围小&#xff0c;可直接暴力求解&#xff0c;…

Studio One2024免费版永久使用下载

当然可以。Studio One 6是一款功能强大且易于使用的数字音频工作站软件&#xff0c;适用于各种音乐制作和音频处理需求。以下是一些关于Studio One 6的详细信息&#xff1a; Studio One6下载: https://wm.makeding.com/iclk/?zoneid39867 多轨录音和混音&#xff1a;Studio …

代码随想录算法训练营第二十四天 | 回溯算法理论基础,77. 组合 [回溯篇]

代码随想录算法训练营第二十四天 回溯算法理论基础什么是回溯法回溯法的理解回溯法模板 LeetCode 77.组合题目描述思路参考代码总结修改后的代码(微调整)优化版本优化后的参考代码 回溯算法理论基础 文章讲解&#xff1a;代码随想录#回溯算法理论基础 视频讲解&#xff1a;带你…

[WebDav] WebDav基础知识

文章目录 什么是WebDavWebDav常用命令WebDav常用命令的测试&#xff08;代码&#xff09;PROPFIND 方法测试PUT 方法测试GET 方法测试PROPPATCH方法 WebDav缓存Cache-ControlEtag测试 强制重新验证不需要缓存 WebDav的锁WebDav的状态码WebDav身份验证WebDav版本控制WebDav和FTP…

思考:如何写出让同事难以维护的代码?

本文从【程序命名&注释】【数据类型&类&对象】【控制执行流程】和【程序/结构设计】四个方面梳理了一些真实案例&#xff0c;相信通过这些案例你能迅速get技能&#xff1a;如何写出让同事难以维护的代码doge。 比起什么程序员删库跑路&#xff0c;我更喜欢「写出让…

高校学科竞赛平台|基于springboot高校学科竞赛平台设计与实现(源码+数据库+文档)

高校学科竞赛平台目录 目录 基于springboot高校学科竞赛平台设计与实现 一、前言 二、系统功能设计 三、系统实现 1、竞赛题库管理 2、竞赛信息管理 3、晋级名单管理 4、往年成绩管理 5、参赛申请管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最…

Flask框架:用Python打造精巧而强大的Web应用

在当今数字化时代&#xff0c;Web应用的需求不断增长&#xff0c;而对于开发者来说&#xff0c;选择一个适合的框架来构建Web应用是至关重要的。Flask框架作为一个简洁而灵活的Python微型框架&#xff0c;以其优雅的设计和丰富的可扩展性&#xff0c;为开发者提供了一个强大而精…

HAT论文详解:Activating More Pixels in Image Super-Resolution Transformer

code&#xff1a;https://github.com/XPixelGroup/HAT paper: https://arxiv.org/abs/2309.05239 1. 概述 本文是对Swinir的改进&#xff0c;目前很多图像超分Benchmark的SOTA。相对于SwinIR的改进主要有三个地方&#xff1a;1. 引入Channel Attention,以获得更好的全局能力&…

通过OCR实现纯数字识别

基于飞浆paddle训练框架 照这个改的 https://www.paddlepaddle.org.cn/documentation/docs/zh/practices/cv/image_ocr.html 训练不到10分钟 10epoch cpu&#xff1a;inter i5 8250 U 脚本生成的图10000 验证训练&#xff1a;3:7 预测结果 chatgpt写的代码&#xff0c;生成数…

PLC_博图系列☞基本指令“异或“运算

PLC_博图系列☞基本指令“异或“运算 文章目录 PLC_博图系列☞基本指令“异或“运算背景介绍X&#xff1a;“异或”运算说明参数示例真值表 关键字&#xff1a; PLC、 西门子、 博图、 Siemens 、 异或 背景介绍 这是一篇关于PLC编程的文章&#xff0c;特别是关于西门子的…

shell脚本实现Mysql分库分表备份

一.数据库的分库分表&#xff1f; 12张图把分库分表讲的明明白白&#xff01;阿里面试&#xff1a;我们为什么要分库分表https://mp.weixin.qq.com/s?__bizMzU0OTE4MzYzMw&mid2247547792&idx2&sn91a10823ceab0cb9db26e22783343deb&chksmfbb1b26eccc63b784879…

PCIE1—快速实现PCIE接口上下位机通信(一)

1.简介 PCI Express&#xff08;PCIE&#xff09;是一种高速串行总线标准&#xff0c;广泛应用于计算机系统中&#xff0c;用于连接主板和外部设备。在FPGA领域中&#xff0c;PCIE也被广泛应用于实现高速数据传输和通信。FPGA是一种灵活可编程的集成电路&#xff0c;可以根据需…

猫头虎分享已解决Bug || Web服务故障:WebServiceUnavailable, HTTPServerError

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

ubuntu常见配置

ubuntu各个版本的安装过程大差小不差&#xff0c;可以参考&#xff0c;ubuntu20.04 其它版本换一下镜像版本即可 安装之后需要配置基本的环境&#xff0c;我的话大概就以下内容&#xff0c;后续可能有所删改 sudo apt-get update sudo apt-get install gcc sudo apt-get inst…

vulnhub靶场之Deathnote

一.环境搭建 1.靶场描述 Level - easy Description : dont waste too much time thinking outside the box . It is a Straight forward box . This works better with VirtualBox rather than VMware 2.靶场下载 https://www.vulnhub.com/entry/deathnote-1,739/ 3.启动环…

网络安全“降本增笑”的三大帮手

在网络安全这个快速变化和危机四伏的领域中&#xff0c;通过使用正确的工具和方法&#xff0c;我们可以在工作中取得更高的效率&#xff0c;并降低相关成本。 雷池社区版 雷池社区版—开源Web应用防火墙。这款产品凭借强大的规则引擎&#xff0c;它允许用户自定义安全策略&…