搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
煮酒与君饮
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
三十八、大数据技术之Kafka3.x(1)_kafka 大数据
2
脉冲电子围栏系统介绍_脉冲电子围栏系统介绍
3
实战指南:使用 kube-prometheus-stack 监控 K3s 集群_k3s部署prometheus
4
Mysql创建实例及强制修改密码_mysql强制修改密码
5
快速上手,学会芯驰 X9H PTG4.3 的 DDR 展频调试_dumpclk查运行频率
6
DevC++的使用技巧以及在使用DevC++过程中可能会遇到的一些问题
7
【OCR 学习笔记】二值化——局部阈值方法
8
【linux】解压|压缩|打包命令(tar|zip|rar|bz)_tar 解压
9
线上旧衣回收小程序,隐藏的蓝海回收市场
10
如何平衡冷数据(历史库)的成本与性能?| OceanBase应用实践
当前位置:
article
> 正文
MySQL之慢SQL_mysql 的mansql
作者:煮酒与君饮 | 2024-08-20 10:42:19
赞
踩
mysql 的mansql
写过DB服务的同学们都知道,性能优化很重要,对于数据库应用程序来说,查看慢SQL以优化数据库操作是最基本的,对于以MySQL为DB的应用程序来说也不例外,本文就是以MySQL为例来介绍如何查看慢SQL的问题。在MySQL中,慢SQL就是指所有执行时间大于long_query_time的SQL语句,知道这些语句后你就可以进行相关优化了,比如:加索引、合并语句等。
一、启用慢SQL
1、查看慢SQL是否启用
mysql> show variables like 'log_slow_queries';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| log_slow_queries | OFF |
+------------------+-------+
上面语句能查看慢SQL是否启用了,即Value为ON表示启用了,为OFF表示禁用了。
mysql> show variables like 'long_query_time';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| long_query_time | 10 |
+-----------------+-------+
上面语句能查看执行慢于多少秒的SQL算慢SQL即会记录到日志文件中,Value为10表示大于10秒的会记录。
2、开启慢SQL
如果你的MySQL是源码编译的,那么慢SQL日志文件信息由编译时指定,比如:一般将慢SQL日志文件放在/data/mysql/目录下,文件名为hostname-slow.log。
如果你的MySQL是RPM安装的,那么慢SQL日志文件信息由MySQL配置文件/etc/my.cnf指定,打开配置文件,找到[mysqld]区段,增加日志配置,具体如下:
[mysqld]
log=“
/var/lib/mysql/mysql
.log
”
log_slow_queries="
/var/lib/mysql/
hostname-slow.log
"
long_query_time=2
log指定MySQL日志文件存放路径。
log_slow_queries
指定慢SQL日志文件存放路径,此目录文件一定要有写权限。
long_query_time指定大于多长时间算慢SQL,单位秒。
需要注意的是,上述配置一定要加在[mysqld]后而不是[mysqld_safe]下面,否则不会生效。
配置完后,重启MySQL即可:service mysqld restart
mysql> show variables like 'slow%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| slow_launch_time | 2 |
+------------------+-------+
| slow_query_log | ON |
+------------------+-------+
| slow_query_log_file |
/var/lib/mysql/
hostname-slow.log
|
+------------------+-------+
上面说明开启了慢SQL,并且时间为2秒。
CD到目录
/var/lib/mysql/目录下能看到自动创建了慢SQL日志文件
hostname-slow.log
。
cat
hostname-slow.log会发现里面没有记录,简单测试下:
mysql> select sleep(3);
+------------+
| sleep(3) |
+-------------+
| 0 |
1 row in set
(3.00 sec)
上面执行完了一个3秒的SQL语句,这时候打开慢SQL日志文件就能看到了。
当然除了上面的设置方式外,还可以在mysqld进程启动时,通过参数指定选项
,比如:--log-slow-queries[=file_name
]。
二、慢SQL分析
慢SQL分析可以通过vi直接打开日志文件来做,但是这种方式还是比较原始,实际上慢SQL分析工具有很多种,常用的有如下几款:
1、mysqldumpslow
这是MySQL官方提供的慢SQL日志分析工具,安装好后,执行如下语句就能分析日志:
#mysqldumpslow
/var/lib/mysql/
hostname-slow.log
主要功能是统计不同慢SQL的如下指标:
count(出现次数) Time(执行最长时间/累计总耗费时间)
Lock(等待锁的时间S) Rows(发送给客户端的总行数) 用户及SQL语句
慢SQL日志文件有时候记录数会比较多,那么mysqldumpslow提供了一些参数用于解决这些问题:
mysqldumpslow -s r -t 10
/var/lib/mysql/
hostname-slow.log
上面命令会以查询时间来排序并显示前10条查询,其中,参数s表示排序选项(c:查询次数、r:返回记录行数、t:查询时间),参数t表示只显示top n条查询。
2、mysqlsla
这是由hackmysql.com提供的一款日志分析工具,该网站还提供了mysqlreport、mysqlidxchk等实用的mysql工具值得学习。
安装好后,执行如下命令就能分析日志了:
#mysqlsla -lt slow
/var/lib/mysql/
hostname-slow.log
该工具方便用户分析慢查询的原因,包括执行频率、数据量、查询消耗等,具体包含信息如下:
queries total(总查询次数) unique(去重后的SQL数量)
Sorted by(报表按照什么排序)
Gand Totals(慢SQL统计信息):Time(平均执行时间),Lock(等待锁时间),Rows Sent(总行数),Rows Examined(总扫描行数)
Count(SQL执行次数及占总慢SQL数量的百分比)
Time(执行时间):包括总时间、最小/最大时间、时间占总慢SQL时间的百分比
Lock Time(等待锁时间)
Rows Sent(行数统计):包括平均、最小/最大数量
Database(数据库)
Users(用户、IP、占所有用户执行SQL的百分比)
Query abstract(抽象后的SQL语句)
Query sample(SQL语句例子)
3、mysql-log-filter
google code上的开源分析工具,提供python和php两种脚本,可以点击这里下载。
执行如下命令就能分析日志:
#python mysql_filter_slow_log.py
/var/lib/mysql/
hostname-slow.log --no-duplicates --sort-execution-count --top=10
功能上类似于mysqldumpslow,但是多出了很多查询时间的统计信息,包括平均、最大、累计等,此外,还对输出内容排版和格式化。
4、myprofi
sourceforge上提供的纯php写的开源分析工具,可以点击这里下载。
执行如下命令就能分析日志:
#php parser.php -slow
/var/lib/mysql/
hostname-slow.log
执行上面命令后,会列出总的慢查询次数和类型、去重后的SQL语句、执行次数及占总
慢SQL数量的百分比。
myprofi的输出比较简洁,适合于只关心慢SQL语句及执行次数的同学。
三、慢SQL优化
SQL优化是一门大工程,不敢狂言,在此只是表述我实际中遇到的问题及优化解决方案来以此达到抛砖引玉的效果。
1、索引问题
在一次压力测试中,发现有一个70W记录的流水表,由于没有加索引导致在update时MySQL服务器CPU瞬间飙到170%,语句类似于下面:
update loginlog set LogoutTime=%lu where RoleName=%s and LoginTime=%lu
loginlog表的主键是自增ID。
对字段
RoleName和
LoginTime建索引后,问题解决了。
因此,对于操作频繁的select、update、带where的delete语句最好对where条件涉及的字段建索引,当然这也会给insert语句带来一定的性能损失。
2、联合主键问题
在一次压力测试中,在慢SQL日志中发现一条记录:
Time Id Command Argument
# Time: 130528 10:45:19
# User@Host: qa_root[qa_root] @ [172.28.14.224]
# Query_time: 0.003057 Lock_time: 0.000026 Rows_sent: 2 Rows_examined: 2262
use friend_relation;
SET timestamp=1369709119;
SELECT FromRoleName FROM userrelation WHERE ToRoleName = 'xxx';
userrelation中
FromRoleName与
ToRoleName为联合主键
,但是上面的where语句中联合主键并没有达到效果。
这是因为,联合主键在索引时,where条件对字段及顺序有要求,比如:
(1)where
FromRoleName='xxx'
(2)
where
FromRoleName='xxx'
and
ToRoleName = 'xxx
'
上述两种情况都有效果。
为字段
ToRoleName建立索引后,问题解决了。
3、分页问题
有时候会对表格记录有limit操作的需求,这就涉及到分页问题,这里贴一段我的DBA同事曾给我的一段关于分页优化的建议吧:
(1)
首次查询的时候缓存结果。这样情况就变得简单了,无论是结果条目的数量,总共的页面数量,还是取出其中的部分条目。
(2)
不显示总共有多少条目。Google搜索结果的分页显示就用了这个特性。很多时候你可能看了前几页,就够了。那么我可以这样,每次我都把结果限制在500条(这个数据越大 资源消耗越大)然后你每次查询的时候,都查询501条记录,这样,如果结果真有501个,那么我们就显示链接 “显示下500条记录”。
(3)
不显示总页面数。只给出“下一页”的链接,如果有下一页的话。(如果用户想看上一页的话,他会通过浏览器来回到上一页的)。那你可能会问我“不显示总页面数”怎么知道是不是有下一页呢?这里有一个很好的小技巧:你在每次显示你当前页面条目的时候你都多查询一条,例如你要显示第11-20个条目时,你就取出11-21条记录(多取一条,并不显示这多取的内容),那么当你发现第21条存在的时候就显示“下一页的链接”,否则就是末页了。这样你就不用每次计算总页面数量了,特别是在做缓存很困难的时候这样做效率非常好。
(4)
估算总结果数。Google就是这么做的,事实证明效果很好。用EXPLAIN 来解释你的SQL,然后通过EXPLAIN的结果来估算。EXPLAIN结果有一列”row”会给你一个大概的结果。(这个办法不是处处都行,但是某些地方效果是很好的)这些办法可以很大程度上减轻数据库的压力,而且对用户体验不会有什么影响。
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/煮酒与君饮/article/detail/1006704
推荐阅读
article
mysql
using
a
p
a
ssword
_Mysql: [W
a
rning] Using
a
p
a
...
mysql
: [W
a
rning] Using
a
p
a
ssword
on the
comm
a
nd
line
interf...
赞
踩
article
MySQL
+
Navicat
下载
、
安装
教程(
Windows
)_
navicat
社区
版...
本文提供
MySQL
和
Navicat
在
Windows
上的
下载
、
安装
及验证步骤。
MySQL
官网
下载
社区
版,
安装
时设置3306...
赞
踩
article
MySQL
+Navicat
安装
教程_
mysql
与
navicat
安装
...
MySQL
数据库Navicat
安装
教程_
mysql
与
navicat
安装
mysql
与
navicat
安装
...
赞
踩
article
window
s安装
mysql
可视化工具
Navicat
for
MySQL
及简单操作_
window
安...
Navicat
for
MySQL
是非常好用的
MySQL
可视化工具之一。以下主要介绍其几种比较常见实用的功能。_wind...
赞
踩
article
【
Navicat
】全方位指南:下载
、
安装
、
配置
连接
与实战应用_
navicat
for
mysql
m...
Navicat
是一套多平台的数据库管理工具,支持MySQL
、
PostgreSQL
、
SQL Server等多种数据库类型。...
赞
踩
article
mysql
和navicat_
mysql
和
neiweicat
...
方法/步骤11、首先单击MySQL5.5.21的安装文件,出现该数据库的安装向导界面,单击“next”继续安装22、在打...
赞
踩
article
mysql
-世界-全球
数据
_
htttp
:
luolinv920
.
cc
...
附带国内精确到市,国外的精确到省吧。下载这里的:https
:
//download.csdn.net/download/l...
赞
踩
article
django
校园
外卖
配送
管理
平台
小
程序
(源码+
mysql
+论文)...
在数据库
管理
工具的选择上,使用了Navicat 11,这是一个用户友好且功能强大的数据库
管理
软件,它支持多种数据库系统,...
赞
踩
article
java
计算机
毕业设计
校园
外卖
点餐小
程序
【附源码+远程部署+
程序
+
mysql
】_
校园
外卖
小
程序
源码...
该小
程序
的开发和运营可以作为学校创新创业教育的实践活动,为计算机专业学生提供一个将理论知识应用到实际问题中的平台,增强学...
赞
踩
article
搞懂高可
用
:
MySQL
双
主
复制,为啥不建议
用
?_
sqlserver
双
主
模式...
拆分为 3306、3306 实例,例如如下架构:图片拆实例后,多实例混合部署,两个实例的主库可以各放在一台主机上,这就完...
赞
踩
article
mysql
如何实现双主
复制
?我们用
docker
来个做实践。_
docker
compose
mysql
...
本文详细介绍了如何使用Docker和
docker
-
compose
搭建并
配置
MySQL的主主
复制
环境,包括创建容器、设置复...
赞
踩
article
mysql
双主
复制
_
配置
步骤、遇到
的
问题及
解决办法
_
mysql
双主
复制
...
MySQL主主
复制
结构区别于主从
复制
结构。在主主
复制
结构中,两台服务器
的
任何一台上面
的
数据库存发生了改变都会同步到另一台...
赞
踩
article
MySQL
-互
为主
从_
linux
中的
mysql
实现
互为
主从关系
...
MySQL
互
为主
从Mysql-A:192.168.189.140Mysql-B:192.168.189.141在A、B上...
赞
踩
article
mysql
枚举
索引
_
mysql
索引
笔记...
本文详细介绍了MySQL中的
索引
类型,包括聚集
索引
和非聚集
索引
,并提供了优化查询的建议,如避免全表扫描,谨慎使用!=、<...
赞
踩
article
mysql
hash
索引
原理
_深入理解 MySQL
索引
底层
原理
...
原标题:深入理解 MySQL
索引
底层
原理
来源:junshili @ 腾讯技术工程一步一步推导出 Mysql
索引
的底层...
赞
踩
article
数据结构
与算法 -
MySQL
-
索引
底层实现 - B+树/
Hash
_
mysql
hash
和b+树...
主要学习
MySQL
索引
底层实现,
数据结构
与算法, 同时了解B+树/
Hash
索引
的区别与优缺点以及各自的应用场景_mysq...
赞
踩
article
【
MySQL
】
MySQL
索引原理以及
查询
优化
_
help
create
index
;...
一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是...
赞
踩
article
mysql
索性_
MySQL
索引
性能
分析...
为什么要做
性能
分析你有没有这样的情况。面对一个你没怎么写过的、复杂的业务,你构思了很久,终于开始敲下了第一段代码。写的过...
赞
踩
article
【
MySQL
】
索引
性能
分析
-
demo
_
索引
type
性能
分析
...
前言 SQL脚本CREATE TABLE `test03` ( `id` int(11) NOT NULL AUTO_I...
赞
踩
article
MySQL
索引
优化_mysql
索引
优化
csdn
...
本文主要讨论
MySQL
索引
的部分知识。将会从
MySQL
索引
基础、
索引
优化实战和数据库
索引
背后的数据结构三部分相关内容,下...
赞
踩
相关标签
mysql using a password
mysql
数据库
navicat
sql
windows
开发工具
可视化工具
学习提升
面试宝典
思维提升
IT信息化
mysql国内全球数据
django
小程序
java
课程设计
docker