慢SQL语句优化

2023-11-01

对慢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这样的字眼,这是很影响性能的。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

慢SQL语句优化 的相关文章

  • Zend Mysql 获取 ENUM 值

    I use Zend Framework在我的应用程序中 我想知道如何从 ENUM 字段中获取值MySQL table 例如 我有permissions field ENUM 删除管理员 edit admin 如何以最佳方式获取数组 删除管
  • 将 Wamp 服务器升级到 MySQL 8.0.15

    因此 我最近在几个月前安装了 WampServer 并预装了 mySQL 5 7 但我想利用 mySQL 8 附带的 NoSQL 功能 为了更新它 我下载了最新的MySQL版本 将文件夹解压到wamp64的bin目录中 然后 我从 5 7
  • 使用 JdbcTemplate 进行动态查询

    我有一个关于使用 JdbcTemplate 进行动态查询的问题 我的代码如下 String insertQueries INSERT INTO tablename StringJoiner joiner new StringJoiner S
  • 将波斯语字符串发送到mysql

    我正在尝试发送Persian字符串到mysql数据库 但它将数据保存为这样的 D8 AC D8 AF DB 8C D8 AF 英文字符串没有问题 var new this val ajax url url new type GET succ
  • MySql 5.0 可以查看位于另一台服务器上的表吗

    MySql 5 0 视图可以使用位于另一台服务器上的表吗 创建这样的视图的语法是什么 联合表 http dev mysql com doc refman 5 0 en federated storage engine html http d
  • mysql - 如果日期不与现有日期重叠,则将日期范围插入日期列

    我有以下表结构 表名 available id autoincremetn acc id start date end date 1 175 2015 05 26 2015 05 31 2 175 2015 07 01 2015 07 07
  • 如何在 Eclipse 中使用 MySql 数据库

    我对编程非常陌生 所以请耐心等待 如果一开始我没有理解的话 请提前道歉 我正在做一个本科编程项目 需要在 Java 程序中创建一些数据库 我正在使用 eclipse galilo 来编写我的程序 我已经下载了一个连接器 J 但还不知道应该如
  • MySQL - 如何按相关性排序? INNODB表

    我在一个名为 cards 的 INNODB 表中有大约 20 000 行 所以 FULLTEXT 不是一个选项 请考虑这张表 id name description 1 John Smith Just some dude 2 Ted Joh
  • 安装 mysql2 时出错:无法构建 gem 本机扩展

    我在尝试安装时遇到一些问题mysql2Rails 的宝石 当我尝试通过运行安装它时bundle install or gem install mysql2它给了我以下错误 安装 mysql2 时出错 错误 无法构建 gem 本机扩展 我该如
  • MySql 完全联接(联合)和多个日期列的排序

    一个相当复杂的 sql 查询 我可能使它变得更加困难 我有两张桌子 消息 newsid 日期时间 新闻文本 图片 图片ID 日期时间 imgPath 两者没有关系 我只是在新闻 图片创建的日期之前加入 到目前为止的 SQL SELECT F
  • 重新排列mysql中的主键

    从MySQL表中删除一些行后如何重新排列主键列值 例如 一个包含 4 行数据的表 主键值为 1 2 3 4 当删除第2行和第3行时 第4行的键值变为2 请帮助我找到解决方案 为什么要这样做 你不需要重新排列您的密钥 因为它只是记录的数字和标
  • MySQL 命令输出在命令行客户端中太宽[重复]

    这个问题在这里已经有答案了 我在用mysql终端模拟器中的命令行客户端lxterminal在Ubuntu中 当我运行以下命令时 mysql gt select from routines where routine name simplep
  • MySQL 多个 IN 条件对同一个表进行子查询

    我有多个带有子查询的 IN 条件 SELECT S name S email FROM something S WHERE 1 NOT IN SELECT id FROM tags WHERE somethingId S id AND 2
  • 工厂模式数据库连接

    我正在尝试使用 MySQL 实现数据库连接上的工厂模式 SQL Server 面临奇怪的错误 你调用的对象是空的 在 SQL 命令对象上 internal class SqlServerDB IDatabase private SqlCon
  • 数据太长,导致列错误(包含国家字符)

    我必须移植一些DBS变成独立的MySQL版本 5 0 18运行于Windows 7 64 位我遇到了一个困扰我的问题 如果我尝试将任何国家 Unicode 字符插入varchar我收到错误 ERROR 1406 22001 Data too
  • Mysql - 如何比较两个 Json 对象?

    将整个 MySql json 列与 json 对象进行比较的语法是什么 以下不起作用 select count criteria from my alerts where criteria industries 1 locations 1
  • 使用 Hibernate Dialect 设置表字符集/排序规则?

    我使用 Hibernate MySQLInnoDB Dialect 来生成 DDL hibernate cfg xml
  • 我应该为 MySQL 使用什么 python 3 库? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 据我所知 MySQLdb 仍然没有移植到 Python 3 pypy 上似乎有另一个名为 PyMySQL
  • 无效的 PDO 查询不会返回错误

    下面的第二条 SQL 语句在 phpMyAdmin 中返回错误 SET num 2000040 INSERT INTO artikel artikel nr lieferant nr bezeichnung 1 bezeichnung 1
  • 在无文本搜索查询中使用 sphinx 与 MySQL

    我有这样的疑问 假设我有一个大表 与一个较小的用户表有关系 这个想法是在那个真正的大表中搜索大于给定日期的日期并按分数 例如大整数 排序 并同时获取相关的用户信息 此查询的结果大约每 10 分钟就会更改一次 所以 没有文本搜索 但我有一个非

随机推荐

  • [ vulhub漏洞复现篇 ] zabbix SQL注入漏洞 (CVE-2016-10134)

    博主介绍 博主介绍 大家好 我是 很高兴认识大家 主攻领域 渗透领域 数据通信 通讯安全 web安全 面试分析 点赞评论收藏 养成习惯 一键三连 欢迎关注 一起学习 一起讨论一起进步 文末有彩蛋 作者水平有限 欢迎各位大佬指点 相互学习进步
  • matlab统计与机器学习工具箱中的7种聚类算法

    1 matlab中自带聚类算法概述 本文简要概述了matlab统计和机器学习工具箱中可用的聚类方法 并给出了其聚类函数 在使用过程中 直接调用该函数即可 十分方便 不得不感慨matlab的强大 聚类分析 又称分割分析或分类分析 是一种常见的
  • 大型网站架构演变和知识体系

    之前也有一些介绍大型网站架构演变的文章 例如LiveJournal的 ebay的 都是非常值得参考的 不过感觉他们讲的更多的是每次演变的结果 而没有很详细的讲为什么需要做这样的演变 再加上近来感觉有不少同学都很难明白为什么一个网站需要那么复
  • 红黑树(Red Black Tree)(C语言实现、200行精简版)

    红黑树 红黑树 Red Black Tree 是一种自平衡的二叉搜索树 与 A V L AVL AVL树类似 在其上进行的插入 删除 查找操作的平均时间复杂度均为 O
  • 服务器感染了MyFile@waifu.club.mkp勒索病毒,如何确保数据文件完整恢复?

    引言 在今天的数字化时代 网络犯罪已成为一个极具威胁性的问题 而勒索病毒正是这一问题中的一大威胁 本文91数据恢复将深入介绍 MyFile waifu club mkp 勒索病毒的威胁 详细探讨如何高效地恢复被其加密的数据文件 并提供关键的
  • C# 常用基础代码汇总

    C 常用基础代码汇总 C 常用的一些基本操作 using System using System IO using UnityEngine public class Tools MonoBehaviour void Start ToStri
  • Java String类中的equals方法

    Java String类的方法equals equal比较的是两个对象所表示的字符是否相等 而 比较的是两个对象是否相等 分析 s1 equals s 只是比较两个对象中的字符是否相等 与对象类型无关 public boolean equa
  • 【特异性双端队列

    题目描述 特异性双端队列 最小调整顺序次数 给定一个队列 但是这个队列比较特殊 可以从头部添加数据 也可以从尾部添加数据 但是只能从头部删除数据 输入一个数字n 会依次添加数字1 n 也就是添加n次 但是在添加数据的过程中 也会删除数据 要
  • webpack 中公共模块,基础库, 多次使用的公共方法单独抽离,以减少包体积和打包时间

    1 使用 html webpack externals plugin 插件 安装 html webpack externals plugin yarn add html webpack externals plugin 配置 webpack
  • 【Docker安装Yapi完整操作步骤】

    Docker安装Yapi完整操作步骤 建议收藏 一 前言 二 准备工作 2 1 安装Docker 2 2 Docker安装MongoDB数据库 2 3 用Navicat连接一下MongoDB查看是否安装成功 三 Docker安装Yapi 3
  • XCode环境变量及路径设置

    一般我们在xcode里面配置包含工程目录下头文件的时候 都要关联着相对路径和绝对路径 如果只是自己用这个项目 用绝对路径的问题不大 但是如果你把工程发给别人 别人就要在改这个绝对路径 这时候绝对路径的缺点立马出现 所以在修改User Hea
  • elk笔记13--Queries-term-level queries

    elk笔记13 Queries term level queries 1 term level 查询简介 2 term level 查询类型 2 1 exists query 2 2 fuzzy query 2 3 ids query 2
  • 【Linux报错】VM虚拟机的CentOS7系统启动时报Generating /run/initramfs/rdsosreport.txt

    一 场景 因Linux无故关机 重启后报错Generating run initramfs rdsosreport txt 二 解决 1 解决步骤 查看 dev mapper下有什么文件 执行xfs repair 重启 2 具体步骤如下 查
  • 服务器云管理系统设计与开发,服务器云管理系统设计与开发

    服务器云管理系统设计与开发 内容精选 换一换 云硬盘 Elastic Volume Service EVS 可以为云服务器提供高可靠 高性能 规格丰富并且可弹性扩展的块存储服务 可满足不同场景的业务需求 适用于分布式文件系统 开发测试 数据
  • struts2+hibernate+spring整合各个相关的配置文件

    一 先把struts2 struts2 2 1 1版 搭起来 1 先拷struts2的jar包 2 配置web xml
  • PyPI 镜像切换至国内源

    临时使用 pip install i https pypi tuna tsinghua edu cn simple some package 设为默认 确保pip更新至最新版本 python m pip install upgrade pi
  • java----关于Console类的报错

    public class console public static void main String args Console console System console String root console readLine 账户
  • 如何正确应用GNU GPLv3 和 LGPLv3 协议

    文章目录 前言 GNU GPLv3 0 Permissions 许可 Conditions 条件 Limitations 限制 GNU LGPLv3 0 应用GPLv3 0 应用LGPLv3 0 建议的内容 添加文件头声明 附录 GNU G
  • 让更多消费者接受刷脸支付养成刷脸习惯

    扫码支付能够取代现金和刷卡支付 就是基于其便捷的支付体验 消费者只要带上手机 用手机扫码就可以完成支付 免去了许多携带现金或卡的不便 降低了遗失风险 但是扫码支付也是过度依赖了手机这一媒介 在手机忘带和没电的时候 也是束手无策 基于此 刷脸
  • 慢SQL语句优化

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