慢SQL语句优化

article/2025/10/28 15:30:27

对慢SQL语句优化一般可以按下面几步思路:开启慢查询日志,设置超过几秒为慢SQL语句,抓取慢SQL语句;通过explain查看执行计划,对慢SQL语句分析;创建索引并调整语句,再查看执行计划,对比调优结果。

   参数 slow_query_log :表示是否开启慢查询日志。语句“set global slow_query_log=on”临时开启慢查询日志,如果想关闭慢查询日志只需要执行“set global slow_query_log=off ”即可。

  • 参数slow_query_log_file:当使用文件存储慢查询日志时(log_output设置为“FILE”或者“FILE,TABLE”时),指定慢查询日志存储于哪个日志文件中,默认的慢查询日志文件名为“主机名-slow.log”,慢查询日志的位置为datadir参数所对应的目录位置。另外,在MySQL 5.7.2之后,如果
  • 设置了慢日志是写到文件里,就需要设置log_timestamps(默认是UTC时间,比我们晚8小时,需要设置为系统时间log_timestamps=SYSTEM)来控制写入到慢日志文件里面的时区(该参数同时影响general日志和error日志)。
  • 参数long_query_time :表示“多长时间的查询”被认定为“慢查询”,默认值为10秒,表示超过10秒的查询被认定为慢查询。语句“set long_query_time=5”表示现在起所有执行时间超过1秒的SQL都将被记录到慢查询文件中。
  • 参数log_queries_not_using_indexes :表示如果运行的SQL语句没有使用到索引,是否也被当作慢查询语句记录到慢查询日志中,OFF表示不记录,ON表示记录。
  • 参数log_throttle_queries_not_using_indexes :当log_queries_not_using_indexes设置为ON时,没有使用索引的查询语句也会被当作慢查询语句记录到慢查询日志中。使用log_throttle_queries_not_using_indexes可以限制这种语句每分钟记录到慢查询日志中的次数,因为在生产环境中有可能有很多没有使用索引的语句,此类语句频繁地被记录到慢查询日志中,可能会导致慢查询日志快速不断地增长,管理员可以通过此参数进行控制。

  慢查询日志中给出了账号、主机、运行时间、锁定时间、返回行等信息,然后根据这些信息来分析此SQL语句哪里出了问题。当开始使用慢查询功能后,可能随着慢查询日志越来越大,通过vi或cat命令不能很直观地查看慢查询日志,这时就可以使用MySQL内置的mysqldumpslow命令来进行分析。

利用explain分析查询语句

  在工作中,我们用于捕捉性能问题最常用的就是打开慢查询,定位执行效率差的SQL。当我们定位到一个SQL以后还不算完事,我们还需要知道该SQL的执行计划,比如是全表扫描还是索引扫描,这些都需要通过explain去完成。explain命令是查看优化器如何决定执行查询的主要方法,从而知道MySQL如何处理SQL语句以及查询语句是否走了合理的索引。

使用explain,只需要在查询中的select关键字之前增加explain这个词即可,MySQL会在查询上设置一个标记,当执行查询时返回关于在执行计划中每一步的信息,而不是执行它

(1)id:反映的是表的读取顺序或查询中执行select子句的顺序。

① id相同,执行顺序是由上至下的。

② id不同,如果是子查询,id序号会递增,id值越大优先级越高,越先被执行。

③ id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行。

(2)select_type:表示select的类型,主要用于区别普通查询、联合查询、子查询等复杂查询。

① simple:简单的select查询,查询中不包含子查询或union。

② primary:查询中若包含任何复杂的子部分,最外层查询标记为primary。

③ subquery:select或where列表中的子查询。

④ derived(衍生):在from列表中包含的子查询,MySQL会递归执行这些子查询,把结果放在临时表里。

⑤ union:若第二个select出现在union后,则被标记为union;若union包含在from子句的子查询中,外层select将被标记为derived。

⑥ union result:union后的结果集。

(3)table:显示这一步所访问数据库中表名称(显示这一行的数据是关于哪张表的),有时不是真实的表名字,可能是第几步执行的结果的简称。

(4)type:对表的访问方式,表示MySQL在表中找到所需行的方式,又称“访问类型”。常见的访问类型有ALL、index、range、 ref、eq_ref、const、system、NULL(从左到右,性能从差到好)。

① ALL:Full Table Scan,MySQL将遍历全表以找到匹配的行。

② index::Full Index Scan,index与ALL的区别为index类型只遍历索引树。

③ range:索引范围扫描,返回一批只检索给定范围的行,使用一个索引来选择行,一般就是在where语句中出现between、< 、>、in等的查询。这种范围扫描索引比全表扫描要好,因为它只需要开始于索引的某一点,而结束于另一点,不用扫描全部索引。

④ ref:非唯一性索引扫描,返回匹配某个单独值的所有行,本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而它可能会找到多个符合条件的行,所以应该属于查找和扫描的混合体。

⑤ eq_ref:类似ref,区别在于使用的索引是唯一索引,对于每个索引键,表中只有一条记录与之匹配,常见于主键或唯一索引扫描。简单来说,就是多表连接中使用primary key或者unique key作为关联条件。

⑥ const、system:当MySQL对查询某部分进行优化并转换为一个常量时,使用这些类型访问。如果查询条件用到常量,那么通过索引一次就能找到,常在使用primary key或unique的索引中出现。system是const类型的特例,当查询的表只有一行的情况下使用。

⑦ NULL:MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成。

(5)possible_keys:指出MySQL能使用哪个索引在该表中找到行,查询涉及的字段上若存在索引,则该索引将被列出,但不一定会被查询使用。

(6)key:显示MySQL实际决定使用的索引,如果没有选择索引,则显示是NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX或者IGNORE INDEX。查询中若使用了覆盖索引(select后要查询的字段刚好和创建的索引字段完全相同),则该索引仅出现在key列表中。

(7)key_len:显示索引中使用的字节数。

(8)ref:表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值。

(9)rows:显示MySQL根据表统计信息以及索引选用的情况,估算找到所需的记录要读取的行数。

(10)Extra:该列包含MySQL解决查询的说明和描述,包含不适合在其他列中显示但是对执行计划非常重要的额外信息。

① Using where:不用读取表中所有信息,仅通过索引就可以获取所需数据,发生在对表的全部请求列都是同一个索引部分的时候,表示MySQL服务器将在存储引擎检索行后再进行过滤。

② Using temporary:表示MySQL需要使用临时表来存储结果集,MySQL在对查询结果排序时使用临时表,常见于排序(order by)和分组查询(group by)。

③ Using filesort:当Query中包含order by操作而且无法利用索引完成的排序操作称为“文件排序”,创建索引时会对数据先进行排序,出现using filesort一般是因为order by后的条件导致索引失效,最好进行优化。

④ Using join buffer:表明使用了连接缓存,比如说在查询的时候,多表join的次数非常多,就将配置文件中缓冲区的join buffer调大一些。如果出现了这个值,应该注意,根据查询的具体情况可能需要添加索引来改进。

⑤ Using index:只使用索引树中的信息,而不需要进一步搜索读取实际的行来检索表中的列信息。相应的select操作中使用了覆盖索引,避免访问了表的数据行,效率好。覆盖索引:select后的数据列只从索引就能取得,不必读取数据行,且与所建索引的个数(查询列小于等于索引个数)、顺序一致。如果要用覆盖索引,就要注意select的列只取需要用到的列,不用select *,同时如果将所有字段一起做索引会导致索引文件过大,性能会下降。

⑥ Using Index Condition:表示进行了ICP优化。

总结一下针对explain命令生成执行计划:首先关注查询类型type列,如果出现all关键字,代表全表扫描,没有用到任何index;再看key列,如果key列是NULL,代表没有使用索引;然后看rows列,该列数值越大意味着需要扫描的行数越多,相应耗时越长;最后看Extra列,要避免出现Using filesort或Using temporary这样的字眼,这是很影响性能的。


http://chatgpt.dhexx.cn/article/p9Ln162Q.shtml

相关文章

mysql之sql语句优化

这篇文章从15个方面&#xff0c;分享了sql优化的一些小技巧&#xff0c;希望对你有所帮助。 1 避免使用select * 很多时候&#xff0c;我们写sql语句时&#xff0c;为了方便&#xff0c;喜欢直接使用select *&#xff0c;一次性查出表中所有列的数据。 反例&#xff1a; sel…

MySql SQL语句优化方法

1.插入优化 当数据过大时&#xff0c;通过load函数上传 2.主键优化 页分裂&#xff1a;当数据乱序插入时&#xff0c;由于主键是按序排的&#xff0c;所以再插入时&#xff0c;当发现页的空间不够时&#xff0c;会通过重新开辟一个页&#xff0c;将原页中的数据拷贝进新的页中…

SQL 语句优化

MySQL 策略优化 索引(Index) 一、优化细则 在 where 子句中使用 ! 或 <> 操作符&#xff0c;会导致引擎放弃使用索引而进行全表扫描。SQL 中不等于操作符会限制索引&#xff0c;造成全表扫描&#xff0c;即使比较的字段上有索引。 模糊查询效率很低原因&#xff1a;l…

算法设计与分析 (知识点总结)

算法设计与分析 目录 算法设计与分析前言第一章 算法基础1.1 算法概述1.2 算法分析1.3 算法复杂度1.4 渐近表示法 第二章 分治法 前言 通过学习掌握算法设计的主要方法&#xff0c;对算法的时、空复杂性有正确分析的能力&#xff0c;能够针对具体的应用问题选择合适的数据结构并…

算法设计与分析——prim算法

目录 前言一、算法思想分析二、算法效率分析三、算法代码C语言代码 后记 前言 在上一篇文章中&#xff0c;我们聊了聊KMP算法&#xff0c;一个极其高效但又非常难以理解&#xff08;个人看来&#xff09;的算法&#xff0c;如果有朋友想要深度讨论&#xff0c;欢迎私信。 本篇…

计算机算法设计与分析(1-6章 复习笔记)

计算机算法设计与分析 最近发现一些刷题的网站&#xff0c;牛客、力扣&#xff0c;很适合用来熟悉算法和语言知识点。 第1章 算法概述 1.1 算法与程序 算法 是解决问题的一种方法或一个过程。 严格地说&#xff0c;算法是由若干条指令组成的有穷序列&#xff0c;且满足下述4条…

算法设计与分析——概述

概述 算法的概念何为算法算法的五大特征算法设计的基本步骤算法与数据结构 算法分析算法时间复杂度算法空间复杂度渐进符号&#xff08;O、Ω和θ&#xff09; 算法设计工具——STLSTL概述何为STL容器何为STL算法何为STL迭代器 常用STL容器顺序容器关联容器适配器容器 推荐书籍…

算法设计与分析 —— 算法的复杂度分析

什么是算法的复杂度 &#xff08;1&#xff09;算法复杂度即算法所需要的计算机资源 &#xff08;2&#xff09;算法的复杂度可分为算法的时间复杂度 T ( n ) T(n) T(n) 和算法的空间复杂度 S ( n ) S(n) S(n)&#xff0c;其中 n n n 是问题的规模&#xff08;输入大小&am…

算法设计与分析 第一章 基础知识作业1

目录 算法分析题1.1 函数的渐进表达式1.3 证明对于任何实数x和整数a,b,n:1.7 函数渐进阶 算法实现题1.1 统计数字问题1.3 最多约数问题 算法分析题 1.1 函数的渐进表达式 求下列函数的渐近表达式&#xff1a;3n210n; n2/102n; 211/n; logn3; 10log3n 1.3 证明对于任何实数x…

USTC算法设计与分析-总结

《算法设计与分析》是中国科学技术大学计算机专业的研究生学科基础课&#xff0c;黄刘生老师讲概率算法和近似算法&#xff0c;汪炀老师讲分布式算法&#xff0c;因为课程内容繁杂且难度较大&#xff0c;所以结合了上课所做笔记和期末复习总结成思维导图&#xff0c;梳理下思路…

《算法设计与分析基础》第2版

今天开始学习《算法设计与分析基础》这本书&#xff0c;书中提及的算法均会在后续博客实现。 清华大学出版社。

算法设计与分析重点总结

考试题型&#xff1a; 选择 2* 10个 填空2* 10个 简答 3* 4个 程序分析填空 4* 4个 综合&#xff08;代码&#xff09;8* 4个 第一章基础知识 1.算法的定义 算法就是解决问题的方法&#xff0c;是解决某一特定问题的一组有穷指令的序列&#xff0c;是完成一个任务所需要的具…

算法设计与分析基础 第八章谜题

习题8.1 6.切割木棍问题 为下列问题设计一个动态规划算法。已知小木棍的销售价格pi和长度i相关&#xff0c;i1,2&#xff0c;…&#xff0c;n&#xff0c;如何把长度为n的木棍切割为若干根长度为整数的小木棍&#xff0c;使得所获得的总销售价格最大&#xff1f;该算法的时间效…

算法设计与分析基础(三)

算法设计与分析基础(三) 练习题 根据下列函数的增长次数按照从低到高的顺序对他们进行排序。 解答&#xff1a; 解答&#xff1a; 即&#xff0c;该多项式的始终值为ak*n^k,则结论成立。 考虑下面的算法&#xff1a; 算法Mystery(m) //输入:非负整数n S←0 for i←1 to …

算法设计与分析基础

To All Of You&#xff1a; 一个人在接受科技教育时能得到的最珍贵的收获是能够终身受用的通用智能工具。 在讨论算法的书籍中&#xff0c;一般会采用两种方案中的一种&#xff1a; 1.第一种方案是按照问题的类型对算法进行分类。这类教材安排了不同的章节分别讨论排序&…

第一章 算法设计与分析基础知识

系列文章目录 第一章 算法设计与分析基础知识 第二章 算法的分治策略 第三章 算法的动态规划 第四章 算法的贪心法 …… [TOC](这里写目录标题) # 一级目录 ## 二级目录 ### 三级目录 参考教材 《算法设计与分析&#xff08;第2版&#xff09;》是由屈婉玲、刘田、张立昂、王…

算法设计与分析——算法分析基础

算法分析主要是时间复杂度和空间复杂度的两个方面的分析 此处带着问题小预告一把&#xff1a; 时间复杂度&#xff1f;空间复杂度&#xff1f; 大O、大和大分别表示什么&#xff1f; 如何得到递归方程&#xff1f;如何求解递归方程呢&#xff1f; 带着问题来探索吧~ 目录…

算法设计与分析(1)——基础知识

写完 Java 的我又开始对 算法设计与分析 下手了(✿◡‿◡) 内容主要是以 北京大学 屈婉玲老师的 MOOC 视频来写的&#xff0c;视频共是十周的内容&#xff0c;我决定用 五 篇博客完成。 温馨提示&#xff1a;这个课程不仅适用于 算法设计与分析 的学习&#xff0c;也非常适用…

算法设计与分析——算法基础初步了解

算法的概念 算法:一个有计算步骤构成的序列&#xff0c;可以将一组输入值转换成相应的输出值。或可以用例解决一个明确的问题。 问题&#xff1a;输入及相应输出的描述&#xff1a; 算法的特点&#xff1a;确定性、可行性、输入和输出及有穷性。 正确的算法&#xff1b;停机并…

算法设计与分析基础知识

一、算法设计基础 算法是&#xff08;algorithm&#xff09;是对特定问题求解步骤的一种描述&#xff0c;是指令的有限序列。 算法的五个特性&#xff1a; 输入&#xff1a;一个算法可以有零个或多个输入。 输出&#xff1a;一个算法有一个输出或多个输出。 有穷性&#xff08;…