有哪些SQL优化的手段?

article/2025/9/18 13:16:27

文章目录

      • 1.1 SQL的性能分析
        • 1.1.1 通过 show status 命令了解各种 SQL 的执行频率
        • 1.1.2 慢查询日志
        • 1.1.3 profile分析
        • 1.1.4 通过 EXPLAIN 分析低效 SQL 的执行计划
      • 1.2 常用的SQL语句优化

1.1 SQL的性能分析

  当面对一个有 SQL 性能问题的数据库时,我们应该首先进行系统的分析,使得能够尽快定位问题 ,并通过优化SQL 从而解决问题。

1.1.1 通过 show status 命令了解各种 SQL 的执行频率

  MySQL 客户端连接成功后,通过 show [session|global]status 命令可以提供服务器状态信息。show [session|global] status 可以根据需要加上参数“session”或者“global”来显示 session 级(当前连接)的统计结果和 global 级(自数据库上次启动至今)的统计结果。如果不写,默认使用参数是“session”。

show status like 'Com_%';

在这里插入图片描述

Com_xxx 表示执行xxx操作,Value表示每个 xxx 语句执行的次数,通常比较关心的是以下几个统计参数。

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

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

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

此外,以下几个参数便于用户了解数据库的基本情况。

  • Connections:试图连接 MySQL 服务器的次数。
  • Uptime:服务器工作时间。
  • Slow_queries:慢查询的次数。

1.1.2 慢查询日志

  通过慢查询日志定位那些执行效率较低的 SQL 语句。慢查询日志会记录超出自己设置的时间还没有执行完毕的sql。默认情况下,MySQL数据库并不启动慢查询日志,需要我们手动来设置这个参数,如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影响。慢查询日志支持将日志记录写入文件,也支持将日志记录写入数据库表。

SHOW VARIABLES LIKE '%slow_query_log%';

在这里插入图片描述

默认情况下slow_query_log的值为OFF,表示慢查询日志是禁用的,可以通过设置slow_query_log的值来开启。

开启慢查询日志sql:

SET GLOBAL slow_query_log=1;

设置慢查询的超时时间(以秒为单位):

SET GLOBAL long_query_time=2;

使用set global slow_query_log=1开启了慢查询日志只对当前数据库生效,MySQL重启后则会失效。如果要永久生效,就必须修改配置文件my.cnf。

1.1.3 profile分析

  1. 查看profile是否可用:
SELECT @@profiling;

在这里插入图片描述

  1. 开启profile:
SET profiling = 1;
  1. 查看当前会话下的所有sql执行时间:
SHOW PROFILES;

在这里插入图片描述

  1. 查看具体sql的每个步骤消耗时间:
SHOW PROFILE FOR QUERY xx;  -- xx是上图的query_id

在这里插入图片描述

  1. 查看具体sql的cpu消耗时间:
SHOW PROFILE cpu FOR QUERY xx;  -- xx是query_id

在这里插入图片描述

1.1.4 通过 EXPLAIN 分析低效 SQL 的执行计划

explain是非常重要的关键字,通过explain我们可以获得以下信息:

  • 表的读取顺序
  • 数据读取操作的操作类型
  • 哪些索引可以使用
  • 哪些索引被实际使用
  • 表之间的引用
  • 每张表有多少行被优化器查询

使用方法:explain + SQL语句,例如:

explain select * from user where id = 100030011

在这里插入图片描述

  1. id字段

在这里插入图片描述

id可以认为是查询序列号,每一个id代表一个select,一句sql有两个select,就会有两行数据,两个id,不同的id代表不同的子查询。

  • id相同执行顺序由上至下。
  • id不同,id值越大优先级越高,越先被执行。
  • id为NULL最后执行。
  1. select_type:表示查询的类型

常见的类型有:

select_typedescription
SIMPLE简单表,即不使用表连接或者子查询
PRIMARY包含子查询时,外层查询就显示为 PRIMARY
UNIONUNION 中的第二个或者后面的查询语句
SUBQUERY子查询中的第一个 SELECT
  1. table:输出结果集的表

显示这一行的数据是关于哪张表的,有时不是真实的表名字,也可能是表的别名。

  1. type:表示表的连接类型

性能由好到差的连接类型为:system、const、eq_ref、ref、ref_or_null、index_merge、unique_subquery、index_subquery、range、index、all等。

typedescription
system表中仅有一行,即常量表
const单表中最多有一个匹配行,例如 primary key 或者 unique index
eq_ref对于前面的每一行,在此表中只查询一条记录,简单来说,就是多表连接中使用 primary key或者 unique index
ref与 eq_ref 类似,区别在于不是使用 primary key 或者 unique index,而是使用普通的索引
ref_or_null与 ref 类似,区别在于条件中包含对 NULL 的查询
index_merge索引合并优化
unique_subqueryin 的后面是一个查询主键字段的子查询
index_subquery与 unique_subquery 类似,区别在于 in 的后面是查询非唯一索引字段的子查询
range单表中的范围查询
index对于前面的每一行,都通过查询索引来得到数据
all对于前面的每一行,都通过全表扫描来得到数据
  1. possible_keys:表示查询时,可能使用的索引。
  2. key:表示实际使用的索引。
  3. key_len:索引字段的长度。
  4. rows:扫描行的数量。
  5. Extra:执行情况的说明和描述。

1.2 常用的SQL语句优化

  1. 不要使用 SELECT *, 必须使用 SELECT <字段列表> 查询。查找哪个字段,就写具体的字段。例如:
select name, age from user where address = 123;

原因:

  • 消耗更多的 CPU 和 IO 以网络带宽资源
  • 无法使用和覆盖索引
  • 可减少表结构变更带来的影响
  1. 不要使用不含字段列表的 INSERT 语句,例如:
-- 不使用:
insert into t values ('a','b','c');
-- 应该使用:
insert into t(c1,c2,c3) values ('a','b','c');
  1. 避免使用子查询,可以把子查询优化为 join 操作。

子查询性能差的原因:

  子查询的结果集无法使用索引,通常子查询的结果集会被存储到临时表中,不论是内存临时表还是磁盘临时表都不会存在索引,所以查询性能会受到一定的影响。特别是对于返回结果集比较大的子查询,其对查询性能的影响也就越大。由于子查询会产生大量的临时表也没有索引,所以会消耗过多的 CPU 和 IO 资源,产生大量的慢查询。

  1. 避免使用 JOIN 关联太多的表。
  • 对于 MySQL 来说,是存在关联缓存的,缓存的大小可以由 join_buffer_size 参数进行设置。

  • 在 MySQL 中,对于同一个 SQL 多关联(join)一个表,就会多分配一个关联缓存,如果在一个 SQL 中关联的表越多,所占用的内存也就越大。

  • 如果程序中大量的使用了多表关联的操作,同时 join_buffer_size 设置的也不合理的情况下,就容易造成服务器内存溢出的情况,就会影响到服务器数据库性能的稳定性。

  • 同时对于关联操作来说,会产生临时表操作,影响查询效率,MySQL 最多允许关联 61 张表,建议不超过 5 个。

  1. 减少同数据库的交互次数。
  • 数据库更适合处理批量操作,合并多个相同的操作到一起,可以提高处理效率。
  1. 禁止使用 order by rand() 进行随机排序。
  • order by rand() 会把表中所有符合条件的数据装载到内存中,然后在内存中对所有数据根据随机生成的值进行排序,并且可能会对每一行都生成一个随机值,如果满足条件的数据集非常大,就会消耗大量的 CPU 和 IO 及内存资源。

  • 推荐在程序中获取一个随机值,然后从数据库中获取数据的方式。

  1. WHERE 从句中禁止对列进行函数转换和计算。
  • 对列进行函数转换或计算时,会导致引擎放弃使用索引而进行全表扫描。

  • 这样的查询也会导致全表扫描:select id from student where name like '%李%',可以考虑使用全文索引。

  1. 在明显不会有重复值时使用 UNION ALL 而不是 UNION。
  • UNION 会把两个结果集的所有数据放到临时表中后再进行去重操作
  • UNION ALL 不会再对结果集进行去重操作
  1. 拆分复杂的大 SQL 为多个小 SQL。
  • 大 SQL 逻辑上比较复杂,需要占用大量 CPU 进行计算
  • MySQL 中,一个 SQL 只能使用一个 CPU 进行计算
  • SQL 拆分后可以通过并行执行来提高处理效率

http://chatgpt.dhexx.cn/article/5wdVD4HO.shtml

相关文章

SQL优化终于干掉了“distinct”

SQL优化之多表联合查询干掉“distinct”去重关键字 一、优化目的二、优化之前的sql长这样三、DISTINCT关键字的用法四、谈&#xff1a;如何优化distinct的sql五、distinct真的和group by等价吗&#xff1f;六、优化后的sql长啥样?七、总结2020.10.14更【来自评论区大佬的精彩观…

SQL关于Date类型时间段查询优化(时间跨度稍长)(记一次自己工作开发中遇到的SQL优化经验)

前言 以下用于SQL查询的数据均为测试环境的数据&#xff0c;关键数据都已打码。 背景 我们的日常开放中都会遇到 查询某个时间段的数据&#xff0c;像这样&#xff1a; select * from test(表名) where time BETWEEN 2022-08-20 00:00:00 AND 2022-09-19 00:00:00但如果时间…

MySql基础知识总结(SQL优化篇)

&#x1f345; 作者简介&#xff1a;CSDN2021博客之星亚军&#x1f3c6;、新星计划导师✌、博客专家&#x1f4aa; &#x1f345; 哪吒多年工作总结&#xff1a;Java学习路线总结&#xff0c;搬砖工逆袭Java架构师 &#x1f345; 关注公众号【哪吒编程】&#xff0c;回复1024&a…

【高级开发必掌握SQL】SQL优化篇

❤️作者主页&#xff1a;小虚竹 ❤️作者简介&#xff1a;大家好,我是小虚竹。Java领域优质创作者&#x1f3c6;&#xff0c;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;掘金年度人气作者&#x1f3c6;&#xff0c;阿里云专家博主&#x1f3…

SQL优化方案

转载至:http://blog.itpub.net/31555484/viewspace-2565387/ 作者1&#xff1a;惨绿少年 https://www.cnblogs.com/clsn/p/8214048.html 作者2:喜欢拿铁的人 https://zhuanlan.zhihu.com/p/49888088 在进行MySQL的优化之前&#xff0c;必须要了解的就是MySQL的查询过程&am…

慢SQL优化

1、慢查询统计 show VARIABLES like %que% SET GLOBAL slow_query_log on; //开启慢sql统计开关 SET GLOBAL long_query_time 1; //设置超过1秒则 认为是慢sql &#xff0c; 注意此处设置完之后需要重新链接客户端 才可以查看到设置成功 2、优化 索引优化 通过执行计划&…

Oracle数据库SQL优化详解

Oracle数据库SQL优化 1. Oracle SQL优化概述2. Oracle SQL优化详解2.1 Oracle 查询阻塞2.2 Oracle 查询耗时 SQL2.3.Oracle 查看执行计划2.4.Oracle 查看收集统计信息2.5.Oracle 查询优化器 -- 改写查询语句2.6.Oracle 查询优化器 -- 访问路径2.7.Oracle 查询优化器 -- 表连接方…

Mysql sql优化

这里引用深入Mysql实战 为什么要优化 提高资源利用率避免短板效应提高系统吞吐量同时满足更多用户的在线需求 简单来说&#xff0c;优化的目的是为了提高资源的利用率&#xff0c;让资源充分发挥价值。常见场景下&#xff0c;一台服务器有四大资源&#xff1a;cup、内存网络…

sql优化的15个小技巧

最近找了找怎么优化SQL,总结了15个基础技巧 因为最近一直在写sql的原因,所以需要知道sql该怎么优化,怕哪一天线上的接口,出了问题,需要优化,就需要采用改造成本最小的. 先上个导图 1.避免使用 select * 很多时候&#xff0c;我们写sql语句时&#xff0c;直接使用select *&am…

聊聊sql优化的15个小技巧

前言 sql优化是一个大家都比较关注的热门话题&#xff0c;无论你在面试&#xff0c;还是工作中&#xff0c;都很有可能会遇到。 如果某天你负责的某个线上接口&#xff0c;出现了性能问题&#xff0c;需要做优化。那么你首先想到的很有可能是优化sql语句&#xff0c;因为它的…

SQL优化的方法

&#xff08;1&#xff09;建立物化视图或尽可能减少多表查询。 &#xff08;2&#xff09;以不相干子查询替代相干子查询。 &#xff08;3&#xff09;只检索需要的列。 &#xff08;4&#xff09;用带in的条件子句等价替换or子句。 &#xff08;5&#xff09;经常提交com…

sql优化的N种方法_持续更新

当你访问网站的时候,有的时候会慢的想让你砸电脑,这个时候服务器要背锅了吗? 不,要背锅的不仅仅是服务器,数据库也有很大责任,不负责任的sql开发者更会让你崩溃的.为了提高sql响应速度,还是好好了解下sql的优化吧 sql优化的方式 一:sql性能分析 sql优化首先要对sql的消耗时…

sql优化常用的几种方法:19种最有效的sql优化技巧

我们来谈谈项目中常用的MySQL优化方法&#xff0c;共19条&#xff0c;具体如下&#xff1a; 1、EXPLAIN 做MySQL优化&#xff0c;我们要善用EXPLAIN查看SQL执行计划。 下面来个简单的示例&#xff0c;标注&#xff08;1、2、3、4、5&#xff09;我们要重点关注的数据&#x…

sql优化的15个小技巧(必知五颗星),面试说出七八个就有了

目录 前言 1 避免使用select * 2 用union all代替union 3 小表驱动大表 4 批量操作 5 多用limit 6 in中值太多 7 增量查询 8 高效的分页 9 用连接查询代替子查询 10 join的表不宜过多 11 join时要注意 12 控制索引的数量 13 选择合理的字段类型 14 提升group by的…

MySQL高级篇(SQL优化、索引优化、锁机制、主从复制)

目录 0 存储引擎介绍1 SQL性能分析2 常见通用的JOIN查询SQL执行加载顺序七种JOIN写法 3 索引介绍3.1 索引是什么3.2 索引优劣势3.3 索引分类和建索引命令语句3.4 索引结构与检索原理3.5 哪些情况适合建索引3.6 哪些情况不适合建索引 4 性能分析4.1 性能分析前提知识4.2 Explain…

Sql优化总结!详细!(2021最新面试必问)

Sql优化 Sql执行顺序基础Sql优化查询SQL尽量不要使用select *&#xff0c;而是具体字段避免在where子句中使用or来连接条件使用varchar代替char尽量使用数值替代字符串类型查询尽量避免返回大量数据使用explain分析你SQL执行计划是否使用了索引及其扫描类型创建name字段的索引优…

如何破解VS2015(使用秘钥)

【时间】2018.10.07 【题目】如何破解VS2015&#xff08;使用秘钥&#xff09; 安装完vs2015 企业版/专业版后&#xff0c;在菜单帮助---注册产品&#xff0c;会显示产品试用期30天&#xff0c;怎么破解呢&#xff1f;其实只要输入相应的秘钥即可完成破解。如若不破解&#x…

vs2015激活码

microsoft visual studio2015是微软推出的一款集程序设计网页开发于一身的开发工具。microsoft visual studio 2015支持c,c,c#以及手机应用开发&#xff0c;用它所写的目标代码适用于微软支持的所有平台&#xff0c;包括Microsoft Windows、Windows Mobile、Windows CE、.NET F…

VS2017 激活密钥

【时间】2018.11.26 【题目】VS2017 激活密钥 一、激活秘钥 Enterprise[企业版]: NJVYC-BMHX2-G77MM-4XJMR-6Q8QF Professional[专业版]: KBJFW-NXHK6-W4WJM-CRMQB-G3CDH 二、秘钥使用 使用位置在 帮助 -- 注册商品 中&#xff1a; 输入秘钥后&#xff0c;激活成功后&a…

Android APP性能测试以及性能指标

Android的app性能测试包括的测试项&#xff1a;Activity响应时间&#xff0c;帧率,内存&#xff0c;cpu消耗,耗电量,冷启动 Activity响应时间的相关测试 查看当前APP打开的页面命令: adb shell dumpsys activity | findstr mResumedActivity然后用命令去打开APP的某个activ…