详细聊聊MySQL中慢SQL优化的方向


Posted in MySQL onAugust 30, 2021

前言

影响一个系统的运行速度的原因有很多,是多方面的,甚至可能是偶然性的,或前端,或后端,或数据库,或中间件,或服务器,或网络等等等等,真正的去定位一个问题需要对系统有一定的认知,可以根据自身的判断去缩小问题范围。

今天不说其他的优化,单独把数据库的优化拿出来说几个优化方向。

跟系统的优化方向一样,数据库的优化,同样也是多方面的,其中涵盖着SQL语句的执行情况,数据库自身的情况等等,下面我们就来说一下MySQL数据库中的慢SQL语句优化方向,希望也能给到大家一些优化思路。

SQL语句优化

SQL语句的优化,有很多文章说起,也有很多在SQL编写上的指导;但是那种只能支持基本开发,如果要排查问题,那就不能单单的只是停留在SQL编写上了,而是有一个整体的发现问题的流程。

本次优化方向,大概分为发现慢查询SQL,查看并解析SQL执行计划,SQL编写上的优化,索引优化等几个方面。

记录慢查询SQL

MySQL中记录慢查询SQL是可以利用MySQL内部配置来实现的,这个配置就是slow_query_log配置。

可利用show variables like '%query%';查询出以下三个相关结果。

long_query_time     | 1.00000
slow_query_log      | off
slow_query_log_file | /data/mysql/mysql_slow.log

解释一下这三个参数,

  • long_query_time:如何区分SQL查询是慢查询,就要规定一个查询时间,超过这个时间的就归类于慢查询,此参数就是来设置时间范围的;以秒为单位,可以设置小数。
  • slow_query_log:此参数为是否开启记录慢查询SQL的开关,两个选择,on或者off,默认为off,所以在这里我们就知道如果要开启慢查询SQL记录,需要手动设置开启。
  • slow_query_log_file:慢查询SQL日志的文件路径,可以自行指定。

如何修改配置

有两个方法。

其一:修改my.ini或者是my.cnf文件,将此三项配置进行一个配置。

其二:直接在sqlplus中,使用set语法来修改参数,但是重启mysql数据库后就会失效,sql如下:

set global long_query_time = 10;

set global slow_query_log = on;

set global slow_query_log_file = /data/mysql/mysql_slow.log;

因为这个方法会重启失效,所以还是建议使用第一种方式。

查看慢查询日志

如何查询慢查询日志呢,如果量很小的情况下,其实是不需要使用工具的,完全可以直接打开即可。

如果量比较大,就需要mysqldumpslow工具查询会更方便。

mysqldumpslow是和mysqld相同类型的执行脚本,可以直接在命令行中执行,具体的使用方法如下:

mysqldumpslow参数:

-s,是order的顺序
-----al 平均锁定时间
-----ar 平均返回记录时间
-----at 平均查询时间(默认)
-----c 计数
-----l 锁定时间
-----r 返回记录
-----t 查询时间

-t,top,即为返回前面多少条的数据
-g,自定义正则表达式

举个例子,如下:

mysqldumpslow -s r -t 5 /data/mysql/mysql_slow.log

查询出返回记录集最多的5个慢查询SQL。

更多用法之后我建个测试库单独写篇文章细说一下。

查看SQL执行计划

查看执行计划关键词:EXPLAIN

如何使用

就是直接执行 EXPLAIN SELECT * FROM TABLE_NAME;

这个一开始我是打算简单说一下的,后来发现篇幅太长了,这个留待下篇文章里,感谢理解。

SQL编写优化

SQL的编写优化就很多了,我这里也整理出了一些,请大家自行查漏补缺。

  • 查询语句无论是使用哪种判断条件 等于、小于、大于, where左侧的条件查询字段不要使用函数或者表达式。
  • 不要直接使用select *,而应该使用具体需要查询的表字段;select * 使用的是全表扫描,不会走索引的。
  • 避免在 WHERE 字句中对字段进行 NULL 判断。
  • 避免在 WHERE 中使用 != 或 <> 操作符。
  • 使 用 BETWEEN AND 替代 IN。
  • 为常用搜索条件创建索引
  • 选择正确的存储引擎, InnoDB 、MyISAM 、MEMORY 等,不同的场景下使用不同的存储引擎会有更好的效果。
  • 使用 like %123% 不会走索引, 而使用 like 123% 会走索引。非常重要!!!
  • 选择合适的字段类型。
  • 设计字段时,要尽量使用NOT NULL。

为何要对慢SQL进行治理

从数据库角度看:每个SQL执行都需要消耗一定I/O资源,SQL执行的快慢,决定资源被占用时间的长短。假设总资源是100,有一条慢SQL占用了30的资源共计1分钟。那么在这1分钟时间内,其他SQL能够分配的资源总量就是70,如此循环,当资源分配完的时候,所有新的SQL执行将会排队等待。

从应用的角度看:SQL执行时间长意味着等待,在OLTP应用当中,用户的体验较差

治理的优先级上

  • master数据库->slave数据库
    • 目前数据库基本上都是读写分离架构,读在从库(slave)上执行,写在主库(master)上执行。
    • 由于从库的数据都是从主库上复制过去的,主库等待较多的,会加大与从库的复制时延。
  • 执行次数多的SQL优先治理
  • 如果有一类SQL高并发集中访问某一张表,应当优先治理。

总结

这里面远远还没有讲全,还有很多种编写规则,同时还有索引的建立并没有聊,留给大家一些自己看书的时间,希望大家有所进步。

到此这篇关于MySQL中慢SQL优化方向的文章就介绍到这了,更多相关MySQL慢SQL优化方向内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
MySQL 隔离数据列和前缀索引的使用总结
May 14 MySQL
解决Navicat for Mysql连接报错1251的问题(连接失败)
May 27 MySQL
MySQL8.0无法启动3534的解决方法
Jun 03 MySQL
MySQL 时间类型的选择
Jun 05 MySQL
详解MySQL中的pid与socket
Jun 15 MySQL
MySQL连表查询分组去重的实现示例
Jul 01 MySQL
mysql5.6主从搭建以及不同步问题详解
Dec 04 MySQL
Mysql忘记密码解决方法
Feb 12 MySQL
MySQL数据库 安全管理
May 06 MySQL
详解Mysql数据库平滑扩容解决高并发和大数据量问题
May 25 MySQL
MySQL数据库配置信息查看与修改方法详解
Jun 25 MySQL
浅谈MySql update会锁定哪些范围的数据
Jun 25 MySQL
MySQL8.0的WITH查询详情
Aug 30 #MySQL
Prometheus 监控MySQL使用grafana展示
Aug 30 #MySQL
MySQL命令无法输入中文问题的解决方式
Aug 30 #MySQL
mysql 索引合并的使用
Aug 30 #MySQL
MySQL去除重叠时间求时间差和的实现
Aug 23 #MySQL
Mysql数据库中datetime、bigint、timestamp来表示时间选择,谁来存储时间效率最高
Aug 23 #MySQL
MySQL的全局锁和表级锁的具体使用
Aug 23 #MySQL
You might like
学习php设计模式 php实现单例模式(singleton)
2015/12/07 PHP
php实现登录tplink WR882N获取IP和重启的方法
2016/07/20 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
2018/02/06 PHP
IE 条件注释详解总结(附实例代码)
2009/08/29 Javascript
JS原型对象通俗&quot;唱法&quot;
2012/12/27 Javascript
关于jQuery新的事件绑定机制on()的使用技巧
2013/04/26 Javascript
jQuery弹性滑动导航菜单实现思路及代码
2013/05/02 Javascript
用JavaScript实现动画效果的方法
2013/07/20 Javascript
jquery如何获取复选框的值
2013/12/12 Javascript
node.js中的buffer.Buffer.isBuffer方法使用说明
2014/12/14 Javascript
基于jQuery+PHP+Mysql实现在线拍照和在线浏览照片
2015/09/06 Javascript
jQuery实现简单隔行变色的方法
2016/02/20 Javascript
AngularJs bootstrap搭载前台框架——js控制部分
2016/09/01 Javascript
angularjs ocLazyLoad分步加载js文件实例
2017/01/17 Javascript
JavaScript中三个等号和两个等号你了解多少
2017/07/04 Javascript
微信小程序动态生成二维码的实现代码
2018/07/25 Javascript
LayUi使用switch开关,动态的去控制它是否被启用的方法
2019/09/21 Javascript
Vue自定义表单内容检查rules实例
2020/10/30 Javascript
[05:08]顺网杯ISS-DOTA2赛歌 少女偶像Lunar青春演绎
2013/12/05 DOTA
[04:22]DOTA2大事件之护国神翼
2020/08/14 DOTA
python 控制语句
2011/11/03 Python
Python列表list操作符实例分析【标准类型操作符、切片、连接字符、列表解析、重复操作等】
2017/07/24 Python
Python Opencv提取图片中某种颜色组成的图形的方法
2019/09/19 Python
python 字典有序并写入json文件过程解析
2019/09/30 Python
15行Python代码实现免费发送手机短信推送消息功能
2020/02/27 Python
CSS3制作hover下划线动画
2017/03/27 HTML / CSS
解决html5中的video标签ios系统中无法播放使用的问题
2020/08/10 HTML / CSS
日本一家专门经营各种箱包的大型网站:Traveler Store
2016/08/03 全球购物
澳洲国民品牌乡村路折扣店:Country Road & Trenery Outlet
2018/04/19 全球购物
C#如何允许一个类被继承但是避免这个类的方法被重载?
2015/02/24 面试题
社区活动总结报告
2014/05/05 职场文书
党员群众路线对照检查材料思想汇报
2014/09/17 职场文书
工作骂脏话检讨书
2014/10/05 职场文书
办公室个人总结
2015/02/28 职场文书
python本地文件服务器实例教程
2021/05/02 Python
Pytest中skip skipif跳过用例详解
2021/06/30 Python