Mysql效率优化定位较低sql的两种方式


Posted in MySQL onMay 26, 2021

关于mysql效率优化一般通过以下两种方式定位执行效率较低的sql语句。

通过慢查询日志定位那些执行效率较低的 SQL 语句,用 --log-slow-queries[=file_name] 选项启动时, mysqld 会 写一个包含所有执行时间超过 long_query_time 秒的 SQL 语句的日志文件,通过查看这个日志文件定位效率较低的 SQL 。

慢查询日志在查询结束以后才纪录,所以在应用反映执行效率出现问题的时候查询慢查询日志并不能定位问题,可以使用 show processlist 命令查看当前 MySQL 在进行的线程,包括线程的状态、是否锁表等,可以实时地查看 SQL 的 执行情况,同时对一些锁表操作进行优化。

下面我们举例说明一下,如何通过慢查询日志定位执行效率底的 SQL 语句:

开启慢查询日志 , 配置样例:

log-slow-queries

在 my.cnf 配置文件中增加上述配置项并重启 mysql 服务,这时 mysql 慢查询功能生效。慢查询 日志将写入参数 DATADIR (数据目录)指定的路径下,默认文件名是 host_name-slow.log 。

和错误日志、查询日志一样,慢查询日志记录的格式也是纯文本,可以被直接读取。下例中演示了慢查询日志的设置和读取过程。

( 1 )首先查询一下 long_query_time 的值 。

mysql> show variables like 'long%';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| long_query_time | 10 |
+-----------------+-------+
1 row in set (0.00 sec)

( 2 )为了方便测试,将修改慢查询时间为 5 秒。

mysql> set long_query_time=5;
Query OK, 0 rows affected (0.02 sec)

( 3 )依次执行下面两个查询语句。

第一个查询因为查询时间低于 5 秒而不会出现在慢查询日志中:

mysql> select count(*) from order2008;
+----------+
| count(*) |
+----------+
| 208 |
+----------+
1 row in set (0.00 sec)

第二个查询因为查询时间大于 5 秒而应该出现在慢查询日志中:

mysql> select count(*) from t_user;
+----------+
| count(*) |
+----------+
| 6552961 |
+----------+
1 row in set (11.07 sec)

( 4 )查看慢查询日志。

[root@localhost mysql]# more localhost-slow.log
# Time: 081026 19:46:34
# User@Host: root[root] @ localhost []
# Query_time: 11 Lock_time: 0 Rows_sent: 1 Rows_examined: 6552961
select count(*) from t_user;

从上面日志中,可以发现查询时间超过 5 秒的 SQL ,而小于 5 秒的则没有出现在此日志中。
如果慢查询日志中记录内容很多,可以使用 mysqldumpslow 工具( MySQL 客户端安装自带)来对慢查询日志进行分类汇总。下例中对日志文件 mysql_master-slow.log 进行了分类汇总,只显示汇总后摘要结果:

[root@mysql_master mysql_data]# mysqldumpslow mysql_master-slow.log
Reading mysql slow query log from mysql_master-slow.log
Count: 2 Time=11.00s (22s) Lock=0.00s (0s) Rows=1.0 (2), root[root]@mysql_master
select count(N) from t_user;

对于 SQL 文本完全一致,只是变量不同的语句, mysqldumpslow 将会自动视为同一个语句进行统计,变量值用 N 来代替。这个统计结果将大大增加用户阅读慢查询日志的效率,并迅速定位系统的 SQL 瓶颈。

注意:慢查询日志对于我们发现应用中有性能问题的 SQL 很有帮助,建议正常情况下,打开此日志并经常查看分析。

以上是给大家介绍的Mysql效率优化定位较低sql的两种方式 ,希望以上所述对大家有所帮助。

MySQL 相关文章推荐
多表查询、事务、DCL
Apr 05 MySQL
Mysql基础知识点汇总
May 26 MySQL
Mysql数据库命令大全
May 26 MySQL
mysql外连接与内连接查询的不同之处
Jun 03 MySQL
MySQL连表查询分组去重的实现示例
Jul 01 MySQL
mysql分表之后如何平滑上线详解
Nov 01 MySQL
Mysql如何实现不存在则插入,存在则更新
Mar 25 MySQL
navicat 连接Ubuntu虚拟机的mysql的操作方法
Apr 02 MySQL
MySQL中优化SQL语句的方法(show status、explain分析服务器状态信息)
Apr 09 MySQL
MySQL索引 高效获取数据的数据结构
May 02 MySQL
深入理解MySQL中MVCC与BufferPool缓存机制
May 25 MySQL
详解MySQL的内连接和外连接
May 08 MySQL
Mysql中 unique列插入重复值该怎么解决呢
May 26 #MySQL
MySQL查看表和清空表的常用命令总结
May 26 #MySQL
MySQL中distinct与group by之间的性能进行比较
MySQL中distinct和count(*)的使用方法比较
May 26 #MySQL
MySQL中出现乱码问题的终极解决宝典
如何设计高效合理的MySQL查询语句
May 26 #MySQL
虚拟机linux端mysql数据库无法远程访问的解决办法
May 26 #MySQL
You might like
Yii实现多数据库主从读写分离的方法
2014/12/29 PHP
php判断当前用户已在别处登录的方法
2015/01/06 PHP
php中Ioc(控制反转)和Di(依赖注入)
2017/05/07 PHP
php微信公众号开发之欢迎老朋友
2018/10/20 PHP
PHP读取文件,解决中文乱码UTF-8的方法分析
2020/01/22 PHP
JavaScript入门教程(12) js对象化编程
2009/01/31 Javascript
JS DOM 操作实现代码
2010/08/01 Javascript
ajax 缓存 问题 requestheader
2010/08/01 Javascript
js DOM的学习笔记
2011/12/22 Javascript
jQuery学习笔记 操作jQuery对象 属性处理
2012/09/19 Javascript
JavaScript中使用Object.prototype.toString判断是否为数组
2015/04/01 Javascript
AngularJS中的过滤器使用详解
2015/06/16 Javascript
AngularJS 中文API参考手册
2016/07/28 Javascript
AngularJS 实现点击按钮获取验证码功能实例代码
2017/07/13 Javascript
浅谈Vue Element中Select下拉框选取值的问题
2018/03/01 Javascript
基于vue1和vue2获取dom元素的方法
2018/03/17 Javascript
详解js获取video任意时间的画面截图
2019/04/17 Javascript
vscode vue 文件模板的配置方法
2019/07/23 Javascript
Vue前端项目部署IIS的实现
2020/01/06 Javascript
Nuxt页面级缓存的实现
2020/03/09 Javascript
Vue前端判断数据对象是否为空的实例
2020/09/02 Javascript
[00:59]DOTA2荣耀之路1:Doom is back!weapon X!
2018/05/22 DOTA
CentOS下使用yum安装python-pip失败的完美解决方法
2017/08/16 Python
解决Pycharm无法import自己安装的第三方module问题
2018/05/18 Python
pytorch 图像预处理之减去均值,除以方差的实例
2020/01/02 Python
python利用百度云接口实现车牌识别的示例
2020/02/21 Python
python GUI库图形界面开发之PyQt5日期时间控件QDateTimeEdit详细使用方法与实例
2020/02/27 Python
jupyter lab文件导出/下载方式
2020/04/22 Python
python中绕过反爬虫的方法总结
2020/11/25 Python
基于html和CSS3制作酷炫的导航栏
2015/09/23 HTML / CSS
欧洲顶级的童装奢侈品购物网站:Bambini Fashion(面向全球)
2018/04/24 全球购物
阿联酋最好的手机、电子产品和家用电器网上商店:Eros Digital Home
2020/08/09 全球购物
大学自我鉴定范文
2013/12/26 职场文书
2015年司机年终工作总结
2015/05/14 职场文书
运动会新闻稿
2015/07/17 职场文书
Go语言带缓冲的通道实现
2021/04/26 Golang