Mysql的语句执行很慢,如何分析排查?

1、检查服务器性能是否存在瓶颈

如果系统资源使用率比较高,比如CPU,硬盘,那访问肯定会慢,如果你发现是Mysl占比比较高,说明Mysql的读写频率高,如果本身网站访问量不大,说明你的sql参数,sql语句查询慢导致

df -h:终端中输入命令,将显示系统中每个分区的磁盘使用情况,包括已使用、可用和总容量。

top :终端输入top 命令,每个进程的信息包括进程 ID(PID)、用户、CPU 使用率、内存使用率、进程名称等。你可以根据需要查看更多详细信息,例如进程的命令行参数、线程数等。

2、优化SQL参数

  1. max_connections:表示MySQL服务器可以同时处理的最大连接数。默认值为151,可以根据实际需求进行调整。
  2. wait_timeout:表示一个空闲连接在被断开之前可以保持多长时间。默认值为28800秒(8小时),可以根据实际需求进行适当调整。
  3. interactive_timeout:表示一个交互式连接在被断开之前可以保持多长时间。默认值为28800秒(8小时),可以根据实际需求进行适当调整。

(1)# 打开MySQL的配置文件

sudo vi /etc/mysql/my.cnf

(2)编辑my.cnf文件,在[mysqld]部分添加以下内容:

max_connections = 200

wait_timeout = 600

interactive_timeout = 600

log-queries-not-using-indexes = on

  1. max_connections:表示MySQL服务器可以同时处理的最大连接数。默认值为151,可以根据实际需求进行调整。
  2. wait_timeout:表示一个空闲连接在被断开之前可以保持多长时间。默认值为28800秒(8小时),可以根据实际需求进行适当调整。
  3. interactive_timeout:表示一个交互式连接在被断开之前可以保持多长时间。默认值为28800秒(8小时),可以根据实际需求进行适当调整。
  4. log-queries-not-using-indexes = on :记录未使用索引的查询

(3) 保存文件并重启MySQL服务

sudo service mysql restart

3、开启query相关变量,进行慢查询记录

show variables like '%query%';查看query相关变量

开启慢查询日志,此时OFF已经被我们用命令改为on了。

4、慢查询语句

当我们执行一条SQL语句进行查询的话,如果执行时间超出了我们刚才设备的阈值10秒就会被记录日志文件中,定义为慢查询语句

进入到记录的慢查询日志文件中,我们可以使用慢日志分析工具---mysqldumpslow对记录的sql语句进行筛选,(安装教程自己百度一下即可) 还有一个工具mysqlsla 分析慢查询日志(安装百度搜一下)

执行命令:

复制代码
[root@chances126 /]# mysqldumpslow   /var/lib/mysql/mysql-slow.log

显示最慢的10条查询:mysqldumpslow -t 10 /path/to/slow-query.log

代表按照SQL执行时间,返回slowlog中前4条慢:mysqldumpslow -a -s t -t 4 -v /var/lib/mysql-slow.log,如下内容显示:

5、根据筛选出来的慢查询语句使用explain进行分析优化

复制代码
[root@chances126 /]# 
mysql> use  sc_epg_release4
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> EXPLAIN select distinct a.*    from EPG_CONTENT_SERIES a join EPG_CATEGORY_ITEM b on a.CONTENT_CODE = b.ITEM_CODE     where a.ENABLE_STATUS=1 and b.STATUS=0 and a.EXTERNAL_CODE = '2000000200000010042000000006088';
+----+-------------+-------+------+---------------+-------------+---------+-----------------------------+-------+------------------------------+
| id | select_type | table | type | possible_keys | key         | key_len | ref                         | rows  | Extra                        |
+----+-------------+-------+------+---------------+-------------+---------+-----------------------------+-------+------------------------------+
|  1 | SIMPLE      | b     | ALL  | NULL          | NULL        | NULL    | NULL                        | 28504 | Using where; Using temporary |
|  1 | SIMPLE      | a     | ref  | seriesIndex   | seriesIndex | 387     | sc_epg_release4.b.ITEM_CODE |     1 | Using where                  |
+----+-------------+-------+------+---------------+-------------+---------+-----------------------------+-------+------------------------------+
2 rows in set (0.00 sec)

mysql> 

可以看出 a 表是全表查询,b表级别是 ref ,可以进一步分析 sql 了。

性能从最好到最差:system、const、eq_reg、ref、range、index和ALL.

相关推荐
好奇的菜鸟4 小时前
Spring Boot 事务失效问题:同一个 Service 类中方法调用导致事务失效的原因及解决方案
数据库·spring boot·sql
不太可爱的叶某人5 小时前
【学习笔记】MySQL技术内幕InnoDB存储引擎——第5章 索引与算法
笔记·学习·mysql
岁岁岁平安5 小时前
Redis基础学习(五大值数据类型的常用操作命令)
数据库·redis·学习·redis list·redis hash·redis set·redis string
量子联盟6 小时前
原创-基于 PHP 和 MySQL 的证书管理系统,免费开源
开发语言·mysql·php
小光学长7 小时前
基于vue框架的防疫科普网站0838x(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库
极限实验室7 小时前
使用 Docker Compose 简化 INFINI Console 与 Easysearch 环境搭建
数据库·docker·devops
飞翔的佩奇7 小时前
Java项目:基于SSM框架实现的旅游协会管理系统【ssm+B/S架构+源码+数据库+毕业论文】
java·数据库·mysql·毕业设计·ssm·旅游·jsp
鬼才血脉8 小时前
Linux(centos)安装 MySQL 8
linux·mysql·centos
float_六七10 小时前
SQL六大核心类别全解析
数据库·sql·oracle
Code季风11 小时前
将 gRPC 服务注册到 Consul:从配置到服务发现的完整实践(上)
数据库·微服务·go·json·服务发现·consul